![](/img/trans.png)
[英]How to select all records for only the first 50 distinct values in a column
[英]Combination of all records with distinct column values in Rails
我是Ruby on Rails的新手。 我正在使用Rails 4.0.4。 我有一個表“ Schedule”,其標題為“:course_id”。 我想在一個稱為“行程”的新表中找到不同課程的所有組合。
因此,如果有一個時間表表,其中包含由2個不同的課程組成的3個部分,則每個組合將是2個不同的課程的唯一組合。
例如:附表1具有:{section_id:4,course_id:1},{section_id:5,course_id:1},{section_id:6,course_id:2}
這將返回2條路線:路線1:{section_id:4,course_id:1},{section_id:6,course_id:2}
路線2:{section_id:5,course_id:1},{section_id:6,course_id:2}
以下是我的模型及其連接的列表。
時間表:
class Schedule < ActiveRecord::Base
has_many :sections
has_many :courses, through: :sections
has_many :subjects, through: :courses
end
部分:
class Section < ActiveRecord::Base
belongs_to :courses
belongs_to :schedule
end
課程:
class Course < ActiveRecord::Base
belongs_to :subject
belongs_to :schedule
has_many :sections
end
在我的schedules_controller中,我有一個方法可以訪問從所有可用的不同部分構建的調度表,而這正是我努力尋找一種好的方法或方法的地方。 我可以遍歷每個不同課程的所有部分,然后手動進行這些組合,但是似乎應該有一些更直接的方法來完成此操作。
def get_itineraries
schedules = Schedule.all
end
好吧,似乎您需要n個數組的笛卡爾積(6,不是嗎?)
為了不必重新編程,可以使用現有的gem:
gem 'cartesian'
您需要在application.rb中要求它
require 'cartesian'
如果我說對了,您的課程編號有限,為6,不是嗎?
因此,請執行以下操作:
itineraries=Array.new
(1..6).each do |i|
itineraries[i]=Schedule.select(:section_id).where("course_id=?",i).uniq.map(&:section_id).sort
end
每個課程有6個數組,每個部分都有節。
之后,可以按如下所示使用cartesian
乘積:
all_itineraries=itineraries[1].x(itineraries[2]).x(itineraries[3]).x(itineraries[4]).x(itineraries[5]).x(itineraries[6])
該數組的每一行將包含6個section_ids
,第一個用於course_id=1
,第二個用於course_id=2
, course_id=2
。
嚴格來說,這是一種數學方法,以防您找不到更“ railsie”的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.