我对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
答案 0 :(得分:0)
好吧,你似乎需要n个阵列的笛卡儿积(6,不是吗?)
为了不必重新编程,您可以使用现有的宝石:
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
等。
这绝对是一种数学方法,如果你找不到更多的东西,那就是#34;一个...