Rails范围,按日期和子数据过滤所有内容

时间:2015-06-30 19:31:32

标签: ruby-on-rails ruby-on-rails-4 scope

我有一个名为“广告系列”的模型,而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_atend_at以及父计划。但是,它似乎也不是作为实例方法工作。

1 个答案:

答案 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_atend_at的访问权限。您需要从数据库中获取这些内容或将其作为args传递到您的范围。