我对 Ruby on Rails 还比较陌生。我正在使用 Rails 4.0.4。我有一个表“Schedule”,其中有一列标题为“:course_id”。我想在一个名为“行程”的新表中找到不同类(class)的所有组合。
因此,如果有一个时间表,其中包含由 2 门不同类(class)组成的 3 个部分,则每个组合都将是 2 门不同类(class)的唯一组合。
例如: 时间表 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):
class Course < ActiveRecord::Base
belongs_to :subject
belongs_to :schedule
has_many :sections
end
在我的 Schedules_controller 中,我有一个方法可以访问从所有可用的不同部分构建的时间表,这就是我正在努力寻找好的方法或方式的地方。我可以循环遍历每个不同类(class)的所有部分并手动进行这些组合,但似乎应该有一些更直接的方法来完成这样的事情。
def get_itineraries
schedules = Schedule.all
end
最佳答案
嗯,看来你需要 n 个数组的笛卡尔积(6,不是吗?)
为了不必重新编程,您可以使用现有的 gem:
gem 'cartesian'
您需要在您的 application.rb 中要求这个
require 'cartesian'
如果我没猜错的话,你的 course_ids 数量是有限的,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 个数组,每门类(class)都有不同的部分。
之后,您可以按如下方式使用笛卡尔
积:
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
等等。
这严格来说是一种数学方法,以防您找不到更“railsie”的方法......
关于mysql - Rails 中具有不同列值的所有记录的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23450001/