【发布时间】:2018-06-25 16:40:36
【问题描述】:
我有 Order 模型,其中我有 datetime 列 start 和 int 列 arriving_dur、drop_off_dur 等。它们是以秒为单位的持续时间从开始
然后在我的模型中我有
class Order < ApplicationRecord
def finish_time
self.start + self.arriving_duration + self.drop_off_duration
end
# other def something_time ... end
end
我希望能够做到这一点:
Order.where(finish_time: Time.now..(Time.now+2.hours) )
但我当然不能,因为没有finish_time这样的列。我怎样才能达到这样的效果?
我已经阅读了关于 SA 的 4 种可能的解决方案:
- 急切地加载所有订单并使用过滤器选择它 - 如果有更多订单,这将无法正常工作
- 每次我需要时都有参数化范围,但这意味着代码重复太多
- 每次都有 sql 函数,并使用 select() 将其绑定到模型 - 这很痛苦
- 不知何故使用http://api.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html#method-i-attribute?但我不知道如何将它用于我的案例,或者它是否能解决我遇到的问题。
您对如何解决这个问题有任何想法或一些“最佳实践”吗? 谢谢!
【问题讨论】:
-
我只希望该字段保留在数据库中(即使它是从其他属性计算出来的),以免以后创建复杂的查询和调试问题。在模型中添加钩子,如果其中一个字段发生更改,则更新列,这应该可以解决问题
-
这是正确的,请记住,您正在谈论 Order 模型,它可能会被访问很多时间,所以有一个复杂的查询会一直被访问,似乎最佳。 @kiddorails cmets 似乎是解决您的问题的最佳方式。
-
好的,这是有道理的。我会那样做,谢谢@kiddorails!
标签: ruby-on-rails