Ruby on rails Rails查询:比较两个属性值的计算

Ruby on rails Rails查询:比较两个属性值的计算,ruby-on-rails,ruby-on-rails-4,postgresql-9.1,ruby-2.1,Ruby On Rails,Ruby On Rails 4,Postgresql 9.1,Ruby 2.1,我有一个型号Product,它有一个:created_at时间戳和一个:expiration_in_days属性。产品在创建后的特定天数内被视为过期。如何编写只返回未过期产品的查询 Rails 4,Ruby 2.1,第0.17页 我一直在尝试这样的查询,但没有成功: #product.rb def self.not_expired where('created_at + expiration_in_days * 86400 >= ?', Time.now) end 我有一个纯Ruby

我有一个型号Product,它有一个
:created_at
时间戳和一个
:expiration_in_days
属性。产品在创建后的特定天数内被视为过期。如何编写只返回未过期产品的查询

Rails 4,Ruby 2.1,第0.17页

我一直在尝试这样的查询,但没有成功:

#product.rb
def self.not_expired
  where('created_at + expiration_in_days * 86400 >= ?', Time.now)
end
我有一个纯Ruby版本,运行良好,只是速度较慢:

#product.rb
def self.not_expired
  select{ |p| (p.created_at.to_i + p.expiration_in_days * 86400) >= Time.now.to_i}
end
  • 注意,86400计算将:expiration_in_days整数转换为秒
任何关于比文档()更高级的Rails查询的指针都是非常受欢迎的

提前感谢。

A+B>C是正确的,如果A尝试以下方法:

def self.not_expired
  where("created_at + (expiration_in_days * 86400)::text::interval >= ?", Time.now)
end
更新:添加引用

您可以了解有关日期和时间函数的更多信息


鉴于您的案例有一个特殊要求,即
expiration\u in_days
的值是表中的一列,我们不能使用
created\u+interval expiration\u in_days
。相反,我们需要将其值设置为
interval
。但是您不能直接将cast键入整数,这就是为什么我们首先将其强制转换为
text

我不确定这是否可行,但请尝试类似的方法

def self.not_expired
  where("TIMESTAMP created_at + INTERVAL '1 day' * expiration_in_days >= NOW()")
end

问题是每个记录的过期阈值都不同。我不知道这是怎么解决的。啊哈。这是我的解决方案中的一个问题。测试正在通过,这是有效的。非常感谢。不过,我完全不知道在哪里我会学会这样做。关于这方面的资源有什么建议吗?嗨@steel,我已经用一些参考资料更新了答案。嗯!
def self.not_expired
  where("TIMESTAMP created_at + INTERVAL '1 day' * expiration_in_days >= NOW()")
end