在Rails中将所有记录与不同列值组合在一起

时间:2014-05-03 21:25:18

标签: mysql ruby-on-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

1 个答案:

答案 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;一个...