Rails - 我应该在哪里计算派生属性?

时间:2012-03-22 18:50:13

标签: ruby-on-rails

Ruby on Rails的Noob问题 - 这是我的情况示例:如果我有模型circle和属性radius,我在哪里进行circumference的计算?这是在模型还是控制器中,它看起来如何? circumference需要访问views

另外,我认为我不需要使circumference属于我的模型/数据库的属性,因为它可以从用户输入radius派生出来吗? / p>

1 个答案:

答案 0 :(得分:14)

计算派生属性的逻辑绝对属于模型。圆周是圆圈本身的属性,而不是您如何在网络界面中呈现它。

为了从任何地方访问圆周,只需在类上定义一个方法,例如:

require 'mathn'
class Circle < ActiveRecord::Base
  # assume `radius` column exists in the database

  def circumference
    Math::PI * 2 * radius
  end
end

由于计算圆周的计算量非常便宜,您可以根据需要进行计算。如果它涉及更复杂的计算而你不想多次运行,你可以按如下方式记忆:

def circumference
  @circumference ||= Math::PI * 2 * radius
end

这将在第一次调用方法时设置@circumference实例变量,然后在每次后续调用时返回第一次计算的结果。如果您这样做,则需要确保在半径更改时将@circumference设置为nil,以确保其准确无误。