如何在rails活动记录中的日期上指定小于今天的条件

Ada*_*dam 37 activerecord if-statement ruby-on-rails

我正在试图找出如何拉出我的集合中的所有记录,其中"发布"字段为真,"过期"小于今天.我有以下但我不认为不到一部分是工作,有人可以指出我在正确的轨道上?

  @announcements = Announcement.where(:publish => true, :expires < Date.today)
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助

leo*_*ges 52

试试这个:

@announcements = Announcement.where("publish = ? AND expires < ?", true, Date.today)
Run Code Online (Sandbox Code Playgroud)

  • 我宁愿去:@announcements =announcement.where(publish: true).where("expires &lt; ?", Date.today) 我猜我更喜欢散列键值:-) (3认同)

wyc*_*ean 27

由于这首先出现在谷歌上,我以为我会参与其中.在这种情况下依赖Arel可能更好.

expires = Announcement.arel_table[:expires]
@announcements = Announcement.where(:publish => true)
  .where(expires.lt(Date.today))
Run Code Online (Sandbox Code Playgroud)

这将构建以下SQL查询

-- Using Arel
SELECT "announcements".* FROM "announcements" 
WHERE "announcements"."publish" = 't' 
  AND ("announcements"."expires" < '2016-02-03 18:41:26.454325')

-- Contrast that with the string binding method mentioned above
SELECT "announcements".* FROM "announcements"
WHERE (publish = 't' AND expires < '2016-02-03 18:41:26.454325')
Run Code Online (Sandbox Code Playgroud)

列名是完全限定的,因此在组成此ActiveRecord :: Relation之上的其他查询时,您将避免冲突,即 @announcements

  • 这太棒了,我一直在想如何优雅地做这件事一段时间. (2认同)

Mar*_*cny 7

在其他答案几年后发布此内容,但在我看来,这是最简洁的方法:

Announcement.where(publish: true, expires: ...Date.today)
Run Code Online (Sandbox Code Playgroud)