【问题标题】:How to specify a less than today condition on a date in Rails ActiveRecord如何在 Rails ActiveRecord 中指定日期小于今天的条件
【发布时间】:2011-12-10 16:15:47
【问题描述】:

我正在试图弄清楚如何提取我的集合中的所有记录,其中它们的字段 publish 为 true 并且 expires 小于今天。我有以下内容,但我认为小于部分不起作用,有人可以指出我正确的轨道吗?

Announcement.where(publish: true, :expires < Date.today)

提前感谢您的帮助

【问题讨论】:

    标签: ruby-on-rails activerecord if-statement


    【解决方案1】:

    试试这个:

    Announcement.where("publish = ? AND expires < ?", true, Date.today)
    

    【讨论】:

    • 这似乎解决了我的记录问题,但是当我尝试在视图中调用列表时导致了问题。这与语句或我在控制器中创建此过滤器的方式有关吗?
    • QLite3::SQLException: no such column: true: SELECT "announcements".* FROM "announcements" WHERE (publish = true AND expires
      23: 24:
        25: 26:
      • 27: 28:
  • 我不是 SQL 专家,所以我建议你这样做而不是 @announcements = Announcement.where("publish = ? AND expires &lt; ?", true, Date.today)
  • 我宁愿选择:@announcements = Announcement.where(publish: true).where("expires
  • 【解决方案2】:

    既然这首先出现在谷歌上,我想我会插话的。在这种情况下,依靠 Arel 可能会更好。

    expires = Announcement.arel_table[:expires]
    @announcements = Announcement.where(:publish => true)
      .where(expires.lt(Date.today))
    

    这将构建以下 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')
    

    列名是完全限定的,因此在此 ActiveRecord::Relation 之上编写其他查询时可以避免冲突,即@announcements

    【讨论】:

    • 这太棒了,我一直想知道如何优雅地做到这一点。
    • 我猜arel_table[:expires] 可能是类方法expires_column 上的公告,所以你可以.where(Announcement.expires_column.lt(Date.today))。也许它会使其更可重用。
    • 同意。我推荐这颗宝石github.com/camertron/arel-helpers。而不是生成方法,您可以像读取非常好的哈希一样访问它们,例如Announcement[:expires]。也强烈建议摆弄 www.scuttle.io
    • @wycleffsean 你是我的英雄。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多