我在/表中有两datetime
列:和. 我想查找其出生日期在创建日期前不到 13 年的用户。User
users
created_at
birthdate
等效的 Railsif
语句将是((created_at - birthdate) < 13.years)
如何将其转换为 ActiveRecord 查询(可以在 PostgreSQL 上运行的查询)?这甚至可能吗,还是我必须手动遍历所有记录?
我在/表中有两datetime
列:和. 我想查找其出生日期在创建日期前不到 13 年的用户。User
users
created_at
birthdate
等效的 Railsif
语句将是((created_at - birthdate) < 13.years)
如何将其转换为 ActiveRecord 查询(可以在 PostgreSQL 上运行的查询)?这甚至可能吗,还是我必须手动遍历所有记录?
最简单的方法是使用间隔,那么它几乎是 Rails 版本的直接音译:
User.where(%q{created_at - birthdate < interval '13 years'})
两个时间戳(或时间戳和日期)之间的差异是一个间隔,因此您只需要比较右侧的适当值。
你只需要在你的 where 子句中用 PostgreSQL 语法来表述它。
对于 MySQL,这看起来与使用datediff函数类似:
User.where("DATEDIFF(created_at, birthdate) > (13 * 365)")
13*356 代表 3 年的天数,因为 datediff 返回天数差异。
然后,我会将其封装在类似作用域的函数中,如下所示:
class User < ActiveRecord::Model
def self.age_difference(years)
where("DATEDIFF(created_at, birthdate) > (? * 365)", years)
end
end
所以你可以这样称呼它:
User.age_difference(13).each do |user|
puts user.inspect
end
我想它在 Postgres 中是相似的。