Ruby的日期/时间助手很有用但我发现了一个差异.似乎12个月不等于1年.检查1.月,你会发现它等于30.days,当然,12*30.days = 360.days,比实际年份的长度短5.25天.
当我根据客户指定的授权月数设置访问我们网站的某些组件时,我遇到了这种情况.我发现在运行我的测试时,一个36个月的术语提前几周到期了.解决方案是这样的:
def months_to_seconds(number_of_months)
( (number_of_months.to_f / 12) * 1.year).to_i.seconds
end
Run Code Online (Sandbox Code Playgroud)
这将返回number_of_months表示的一年中任何部分的秒数.
由于1年是等于几秒到365.25天,为什么你认为他们没有1.month返回一年的1/12而不是30天的秒?
以前有人碰过这个吗?有没有人有更好的解决方案?
我们有一个模型关联,看起来像这样:
class Example < ActiveRecord::Base
has_many :others, :order => 'others.rank'
end
Run Code Online (Sandbox Code Playgroud)
rank列是整数类型.虽然我们发现其他模型之间的其他has_many关联存在同样的问题,但这些特定模型的细节并不重要.
我们还添加了Enumerable模块:
module Enumerable
def method_missing(name)
super unless name.to_s[0..7] == 'collect_'
method = name.to_s[8..-1]
collect{|element| element.send(method)}
end
end
Run Code Online (Sandbox Code Playgroud)
这会添加一个collect_id方法,我们可以使用它从ActiveRecord对象数组中获取记录ID数组.
因此,如果我们使用普通的ActiveRecord find:all,我们得到一个很好的数组,然后我们可以使用collect_id,但如果我们使用Example.others.collect_id,我们得到
NoMethodError: undefined method `collect_id' for #<Class:0x2aaaac0060a0>
Run Code Online (Sandbox Code Playgroud)
Example.others.class返回"数组",所以它是说谎还是混淆?
到目前为止,我们的解决方案一直是这样使用它:
Example.others.to_a.collect_id
Run Code Online (Sandbox Code Playgroud)
这有效,但这似乎有点奇怪.你为什么要那样做?
我们使用的是Ruby 1.8.7和Rails 2.3.4