我有以下型号:
关系很简单:
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
研讨会吗?
答案 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)