【问题标题】:When to use lambda when evaluating Time评估时间时何时使用 lambda
【发布时间】:2014-03-16 09:15:18
【问题描述】:

我得到了建议

将“位置”括在 lamda 中,因为 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)

【问题讨论】:

    标签: ruby-on-rails ruby datetime lambda


    【解决方案1】:

    在加载类时评估范围。例如,生产服务器加载一次代码并以相同的评估时间运行,直到服务器重新加载或重新启动。因此,您应该在作用域中使用 lambda。

    当您在方法或 rake 任务中进行查询而不是每次评估的代码时。因此,在这种情况下您不需要使用 lambda。

    【讨论】:

      【解决方案2】:

      据我了解,您应该在创建命名范围时使用 lambda。例如,请参阅https://github.com/bbatsov/rails-style-guide#activerecord。向下滚动一点以到达 lambda 部分。使用 lambda 会导致块内的任何内容都被延迟加载,这意味着在调用它之前不会对其进行评估。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多