我有一个名为“广告系列”的模型,而belongs_to
是一个“日程安排”。
广告系列包含开始日期和结束日期,而日程安排包含“每周一”,“每天”等信息。
我想要选择对特定日期有效的所有广告系列。
# campaign.rb
scope :active, -> { where(status: true) }
scope :inactive, -> { where(status: false) }
def valid_for(date)
includes(:schedules).where("
( start_at >= ? AND (end_at IS NULL OR end_at <= ? ) )
AND schedules.days_of_week = ?",
date,
date,
date.wday
)
end
在我的广告系列规范中(广告系列和计划确实存在于测试中):
expect(Campaign.active.valid_for("2015-06-15".to_date).size).to eq 1
我得到的错误是:
undefined method `valid_for' for #<ActiveRecord::Relation []>
我无法为self.valid_for
使用类方法,因为我需要能够访问属性start_at
和end_at
以及父计划。但是,它似乎也不是作为实例方法工作。
答案 0 :(得分:1)
使其成为范围并使用范围参数:
scope :valid_for, ->(date) {
includes(:schedules).where("
( start_at >= ? AND (end_at IS NULL OR end_at <= ? ) )
AND schedules.days_of_week = ?,
start_at,
end_at,
date.wday
")
}
但这会限制您对start_at
和end_at
的访问权限。您需要从数据库中获取这些内容或将其作为args传递到您的范围。