【问题标题】:Combination of all records with distinct column values in Rails在 Rails 中组合具有不同列值的所有记录
【发布时间】:2014-05-03 21:25:17
【问题描述】:

我对 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 个行程: 行程一:{ section_id: 4, course_id: 1 }, { section_id: 6, course_id: 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

【问题讨论】:

  • 你能写一个你想要的小例子吗?不是 33 和 6,而是 3 和 2...
  • 好的,我编辑了原文,谢谢!

标签: mysql ruby-on-rails


【解决方案1】:

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

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

gem 'cartesian'

你需要在你的 application.rb 中要求这个

require 'cartesian'

如果我猜对了,你的 course_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 个阵列,每个课程都有部分。

之后,您可以使用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 等等。

这严格来说是一种数学方法,以防你找不到更“railsie”的方法......

【讨论】:

    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 2013-11-10
    • 2016-03-23
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多