我得到了
的建议在lamda中包含'where',因为Time.now在计算时被评估 类加载,而不是在调用方法时,如果您的应用程序运行 一个多月后你会开始得到不正确的结果。
示例:
scope :from_this_month, where("vote.created_at > ? AND vote.created_at < ?", Time.now.beginning_of_month, Time.now.end_of_month)
要
scope :from_this_month, lambda { where("votes.created_at > ? AND votes.created_at < ?", Time.now.beginning_of_month, Time.now.end_of_month) }
我有各种函数在计算中使用时间并确定它们是否需要运行。
这些功能是否正常工作,如果不能,即使应用程序运行了一个月后,我将如何包含lambda以获得所需的输出?
模型中的范围
scope :from_this_month, where("votes.created_at: Time.now.beginning_of_month, (Time.now.end_of_month))
在每天运行的rake任务中检查是否必须向特定企业发送报告
task :send_reports => :environment do
if Time.now.monday? && (business.report_schedule == 'monday')
...
end
模型中的方法
employee.votes.exists?(phone_id: self.phone_id, created_at: 7.days.ago..DateTime.now)
答案 0 :(得分:2)
在加载类时评估范围。例如,生产服务器加载代码一次并以相同的评估时间运行,直到重新加载或重新启动服务器。因此,您应该在范围中使用lambdas。
当您在方法或rake任务中进行查询时,每次都会评估代码。因此,在这种情况下你不需要使用lambdas。
答案 1 :(得分:2)
根据我的理解,你应该在创建命名范围时使用lambda。例如,请参阅https://github.com/bbatsov/rails-style-guide#activerecord。向下滚动以进入lambda部分。使用lambda会导致块内的任何内容被延迟加载,这意味着在调用它之前不会对其进行求值。