簡體   English   中英

Rails中所有記錄與不同列值的組合

[英]Combination of all records with distinct column values in 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

好吧,似乎您需要n個數組的笛卡爾積(6,不是嗎?)

為了不必重新編程,可以使用現有的gem:

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=2course_id=2

嚴格來說,這是一種數學方法,以防您找不到更“ railsie”的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM