如何在适当的SQL查询中编写此rails查询?
time = (Time.now - 1.days).beginning_of_day
Assignment.where("created_at >= :time OR updated_at >= :time", time: time).pluck(:assignable_id).uniq
您能帮我在SQL查询中进行转换吗?
select distinct assignable_id from assignments where created_at >= getDate() && updated_at >= getDate();
我需要有关如何在查询时获取日期的帮助吗?
答案 0 :(得分:0)
您可以使用CURDATE()
使用MySQL获取日期。
您的查询将如下所示:
select distinct assignable_id from assignments where created_at >= CURDATE() AND updated_at >= CURDATE();
答案 1 :(得分:0)
无法仅通过ActiveRecord直接使用不平等比较,您将不得不使用Arel,它是ActiveRecord所基于的较低级别的api。幸运的是,您大多数时候都可以混合搭配它们。
time = (Time.now - 1.days).beginning_of_day
assignments = Assignment.arel_table
Assignment.where(
assignments[:created_at].gteq(time).or(assignments[:updated_at].gteq(time))
).distinct.pluck(:assignable_id)
在大多数情况下,从红宝石代码传递当前日期是一个很好的解决方案。但是,如果您确实想使用数据库功能,那么Arel会在这里再次提供帮助。
time = Arel::Nodes::NamedFunction.new('getDate', [])
# or
time = Arel::Nodes::NamedFunction.new('CURDATE', [])
# or any other function you can think of
Arel确实比乍看之下要写原始sql更为复杂,但是关键是可重用性和安全性。通过将Arel代码片段制作为方法,它们易于重用。使用原始sql容易导致注入错误,Arel会阻止您在大多数™️情况下犯这些错误。