我在 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]
。我怎样才能做到这一点?感谢您的阅读。
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')
如果遇到列名称不明确的问题,您可以执行以下操作:
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())
您可以尝试使用:
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)
如果您不喜欢传递字符串,我更喜欢 @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..
的方式向日期添加时间单位
Rails 核心团队决定暂时恢复此更改,以便更详细地讨论它。请参阅此评论和此PR了解更多信息。
我留下我的答案仅用于教育目的。
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 链接,您可以在其中找到更多示例。
现在有一种更简洁的方法可以做到这一点(在日期测试中使用无限范围)
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
后一天可能会更好。