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