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

Nic*_*ick 10 ruby-on-rails

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

另外,我是否正确认为我不需要创建circumference属于我的模型/数据库的属性,因为它可以从用户输入派生radius

Emi*_*ily 14

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

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

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

  def circumference
    Math::PI * 2 * radius
  end
end
Run Code Online (Sandbox Code Playgroud)

由于计算圆周的计算量非常便宜,因此您可以根据需要进行计算.如果它涉及更复杂的计算,你不想多次运行,你可以记住它如下:

def circumference
  @circumference ||= Math::PI * 2 * radius
end
Run Code Online (Sandbox Code Playgroud)

这将@circumference在第一次调用方法时设置实例变量,然后在每次后续调用时返回第一次计算的结果.如果你这样做,你需要确保设置@circumferencenil半径改变时确保它是准确的.