您能在 Rails 3 搜索中对日期进行比比较吗?

问题描述 投票:0回答:6

我在 Rails 3 中进行了此搜索:

Note.where(:user_id => current_user.id, :notetype => p[:note_type], :date => p[:date]).order('date ASC, created_at ASC')

但我需要

:date => p[:date]
条件等于
:date > p[:date]
。我怎样才能做到这一点?感谢您的阅读。

ruby-on-rails activerecord ruby-on-rails-3
6个回答
231
投票
Note.
  where(:user_id => current_user.id, :notetype => p[:note_type]).
  where("date > ?", p[:date]).
  order('date ASC, created_at ASC')

或者您也可以将所有内容转换为 SQL 表示法

Note.
  where("user_id = ? AND notetype = ? AND date > ?", current_user.id, p[:note_type], p[:date]).
  order('date ASC, created_at ASC')

72
投票

如果遇到列名称不明确的问题,您可以执行以下操作:

date_field = Note.arel_table[:date]
Note.where(user_id: current_user.id, notetype: p[:note_type]).
     where(date_field.gt(p[:date])).
     order(date_field.asc(), Note.arel_table[:created_at].asc())

5
投票

您可以尝试使用:

where(date: p[:date]..Float::INFINITY)

相当于sql

WHERE (`date` >= p[:date])

结果是:

Note.where(user_id: current_user.id, notetype: p[:note_type], date: p[:date]..Float::INFINITY).order(:fecha, :created_at)

我也变了

order('date ASC, created_at ASC')

为了

order(:fecha, :created_at)

1
投票

如果您不喜欢传递字符串,我更喜欢 @sesperanto 的做法,除了使其更加简洁之外,您可以在日期范围中删除

Float::INFINITY
,而只需使用
created_at: p[:date]..

Note.where(
    user_id: current_user.id,
    notetype: p[:note_type],
    created_at: p[:date]..
).order(:date, :created_at)

请注意,这会将查询更改为

>=
而不是
>
。如果这是一个问题,您可以随时通过运行类似
p[:date] + 1.day..

的方式向日期添加时间单位

1
投票

更新

Rails 核心团队决定暂时恢复此更改,以便更详细地讨论它。请参阅此评论此PR了解更多信息。

我留下我的答案仅用于教育目的。


Rails 6.1(已恢复)中用于比较的新“语法”

Rails 6.1

where
条件下的比较运算符添加了新的“语法”,例如:

Post.where('id >': 9)
Post.where('id >=': 9)
Post.where('id <': 3)
Post.where('id <=': 3)

因此您的查询可以重写如下:

Note
  .where(user_id: current_user.id, notetype: p[:note_type], 'date >', p[:date])
  .order(date: :asc, created_at: :asc)

这里是 PR 链接,您可以在其中找到更多示例。


0
投票

现在有一种更简洁的方法可以做到这一点(在日期测试中使用无限范围)

p_date = Date.parse(p[:date])
Note.where(:user_id => current_user.id, :notetype => p[:note_type], :date => p_date..).order(:date, :created_at)

注意 - SQL 日期比较将使用 ">=,这并不完全是所要求的。如果数据是date_time,可能没问题。如果是约会,

p_date
后一天可能会更好。

© www.soinside.com 2019 - 2024. All rights reserved.