小编War*_*ren的帖子

在Ruby中,12个月!= 1.1年

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天的秒?

以前有人碰过这个吗?有没有人有更好的解决方案?

ruby ruby-on-rails date-math

11
推荐指数
2
解决办法
3845
查看次数

模型关联返回的数组不是数组?

我们有一个模型关联,看起来像这样:

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

ruby ruby-on-rails associations

2
推荐指数
1
解决办法
3058
查看次数

标签 统计

ruby ×2

ruby-on-rails ×2

associations ×1

date-math ×1