如何在ActiveRecord中从父模型应用子模型关联的条件?

时间:2016-08-27 05:41:47

标签: ruby-on-rails rails-activerecord

我有以下型号:

  1. 员工
  2. 研讨会
  3. 附表
  4. 关系很简单:

    class Staff < ApplicationRecord
      has_many :seminars
    end
    
    class Seminar < ApplicationRecord
      belongs_to :staff
      has_many :schedules
      has_many :future_schedules, -> { future }, class_name: 'Schedule'
      has_many :past_schedules,   -> { past }, class_name: 'Schedule'
    end
    
    class Schedule < ApplicationRecord
      belongs_to :seminar
    
      scope :future, -> { where('starts_at > ?', Time.now) }
      scope :past,   -> { where('ends_at > ?', Time.now) }
    end
    

    我可以轻松地做到:seminar.future_schedules&amp; seminar.past_schedules,但问题在于:我希望能够为将来有工作时间的员工举办研讨会。

    我尝试过:

    has_many :future_seminars, -> { future_schedules }, class_name: 'Seminar'
    

    但问题是:我无法在上面的行中传递future_schedules,因为它不是范围。

    has_many :future_seminars, -> { where('schedules.starts_at > ?', Time.now) }, class_name: 'Seminar'
    

    但它说:schedules.starts_at不是一个列,它就是这样。那么我还是可以使用像schedules之类的东西预先加载includes研讨会吗?

2 个答案:

答案 0 :(得分:2)

您可以这样做:

在研讨会模型中:

has_many :future_seminars, -> { future_seminars }, class_name: 'Seminar'

在员工模型中:

scope :past, -> { where('ends_at < ?', Time.now) }

另外,我认为过去的时间表范围内有类型。它应该是这样的

datatype

答案 1 :(得分:1)

如果你需要一个高性能的方法,那么你可能需要混合一些SQL。

类似的东西:

Staff.find(32).seminars.
               where(Schedule.where("schedules.seminar_id = seminars.id").
                              where("schedules.starts_at > ?", Time.now).exists)