Mysql Rails中具有不同列值的所有记录的组合

Mysql Rails中具有不同列值的所有记录的组合,mysql,ruby-on-rails,Mysql,Ruby On Rails,我对RubyonRails比较陌生。我使用的是Rails 4.0.4。我有一张“时间表”表格,其中有一列标题为:“课程id”。我想在一个名为“行程表”的新表格中找到所有不同课程的组合 所以,如果有一个由2门不同课程组成的包含3个部分的时间表,那么每个组合都是2门不同课程的独特组合 例如: 附表1有:{组别编号:4,课程编号:1},{组别编号:5,课程编号:1},{组别编号:6,课程编号:2} 这将返回两个行程: 行程1:{section_id:4,course_id:1},{section_id

我对RubyonRails比较陌生。我使用的是Rails 4.0.4。我有一张“时间表”表格,其中有一列标题为:“课程id”。我想在一个名为“行程表”的新表格中找到所有不同课程的组合

所以,如果有一个由2门不同课程组成的包含3个部分的时间表,那么每个组合都是2门不同课程的独特组合

例如: 附表1有:{组别编号:4,课程编号:1},{组别编号:5,课程编号:1},{组别编号:6,课程编号:2}

这将返回两个行程: 行程1:{section_id:4,course_id:1},{section_id:6,course_id:2}
行程2:{区段id:5,课程id:1},{区段id:6,课程id:2}

下面是我的模型及其连接的列表

附表:

class Schedule < ActiveRecord::Base
    has_many :sections
    has_many :courses, through: :sections
    has_many :subjects, through: :courses
end

看起来你需要n个数组的笛卡尔积(6,不是吗?)

为了不必重新编程,您可以使用现有的gem:

gem 'cartesian'
您需要在application.rb中使用此选项

require 'cartesian'
如果我没弄错的话,你的ID当然是有限的,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个阵列,每个课程有6个部分

之后,您可以按如下方式使用笛卡尔乘积:

all_itineraries=itineraries[1].x(itineraries[2]).x(itineraries[3]).x(itineraries[4]).x(itineraries[5]).x(itineraries[6])
此数组的每一行将包含6个
节id
,第一个用于
课程id=1
,第二个用于
课程id=2


这是一种严格意义上的数学方法,如果你找不到更“railsie”的方法…

你能写一个你想要的小例子吗?不是33和6,是3和2…当然,我编辑了原文,谢谢!
require 'cartesian'
itineraries=Array.new
(1..6).each do |i|
    itineraries[i]=Schedule.select(:section_id).where("course_id=?",i).uniq.map(&:section_id).sort
end
all_itineraries=itineraries[1].x(itineraries[2]).x(itineraries[3]).x(itineraries[4]).x(itineraries[5]).x(itineraries[6])