Ruby on rails RubyonRails的本年度
如何使用RubyonRails获得今年的成绩 我尝试了很多东西,包括Ruby on rails RubyonRails的本年度,ruby-on-rails,ruby,date,Ruby On Rails,Ruby,Date,如何使用RubyonRails获得今年的成绩 我尝试了很多东西,包括 本年度日期 时间,现在,一年 问题是,如果在启动服务器后年份发生变化(例如新年之后),它们会返回上一年 相关代码: 模型酿酒厂.rb class Brewery < ActiveRecord: :Base ... validates :year, numericality: { only_integer: true, less_than_or_equal_to: Date.today.year } ... clas
- 本年度日期
- 时间,现在,一年
class Brewery < ActiveRecord: :Base
...
validates :year, numericality: { only_integer: true, less_than_or_equal_to: Date.today.year }
...
class Brewery
创建新酿酒厂时出现问题,因此我假设只要发生该操作,就会计算Date.today.year。在您的示例中,Date.today.year在加载类时只计算一次,因此以后不会更改 当您在验证器声明中使用lambda时,它会在每次运行该属性的验证时重新计算该块:
validates :year, numericality: {
only_integer: true,
less_than_or_equal_to: ->(_brewery) { Date.current.year }
}
此外,我建议使用
Date.current
而不是Date.today
,因为current
方法注重时区设置。实际上,最好使用Time.current
而不是Time.now
在Rails中,因为第一个方法采用当前时区。
@spickermann的食谱似乎是正确的,我将试着解释它为什么有效 当Ruby编译成VM字节码时,您在类中编写的代码在编译时执行。因此,在编译类时,验证器中的
Date.today.year
只计算一次
通过引入lambda,您可以使ActiveRecord使用所述lambda的返回值。lambda本身将在每次验证时执行
希望这能让情况更清楚
--时区中的因素您是否需要在ActiveRecord范围内使用它?它们返回当前日期/时间。可能是缓存问题,或者您在生产代码中使用了Timecop?@AtteJuvonen我们可以查看代码吗?Time。现在。year
将始终返回当前年份,除非您直接或通过gem处理类。如果你将值存储在完全不同的地方。在原始问题中添加代码