【问题标题】:Rails scope for values only between two datesRails 仅适用于两个日期之间的值
【发布时间】:2013-09-10 18:57:51
【问题描述】:

我喜欢在 Rails 中有一个范围,只选择两个日期之间的值。

这是我的例子:

我有一个具有“startDate”和“endDate”属性的模型。两者都有类型 'date'

现在我想选择从今天开始的每个条目,这两个日期之间。

我做了一个看起来像这样的范围。

class Product < ActiveRecord::Base
  scope :activeDate, -> { where("? >= ? AND ? <= ?", Time.now.to_date, :saleStartDate, Time.now.to_date, :salesEndDate)}

在控制器中:

@products = Product.activeDate

不幸的是,它不起作用。是否有获取所有条目的rails-way(更漂亮)?

非常感谢。

【问题讨论】:

  • Ruby 约定会将您的范围称为 active_date 而不是 activeDate。

标签: ruby-on-rails scope


【解决方案1】:

你可以这样做:

scope :activeDate, -> { where("? BETWEEN startDate AND endDate", Time.now.to_date)}

由于您使用的是大于或等于 AND 小于或等于,因此您可以使用等效的SQL 函数“BETWEEN”。

不需要将Time转为日期,直接调用Date.today即可:

scope :activeDate, -> { where("? BETWEEN startDate AND endDate", Date.today)}

您可以通过这样做扩大您的范围

scope :activeAtDate, lambda{ |date = Date.today| where("? BETWEEN startDate AND endDate", date) }

并像这样使用它:

Product.activeAtDate() #=> use the Date.today
Product.activeAtDate(1.week.ago.to_date) #=> use Today - minus 7 days

【讨论】:

  • 啊,完美。太感谢了!这太棒了!
  • 我还要注意,当您使用这样的范围时,如果您最终链接或急切加载具有相同列的模型,例如 startDateendDate,您可能会收到一个模棱两可的列引用错误.我用where("? BETWEEN #{table_name}.startDate AND #{table_name}.endDate" 解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
相关资源
最近更新 更多