Ответ 1
Логика вычисления производного атрибута абсолютно принадлежит модели. Окружность является свойством самого круга, а не заботой о том, как вы представляете его в веб-интерфейсе.
Чтобы получить доступ к окружности из любого места, просто определите метод для класса, например:
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
, когда радиус изменится, чтобы убедиться в его правильности.