Rails - Где мне рассчитать производные атрибуты?

Вопрос Noob для Ruby on Rails - вот пример моей ситуации: если у меня есть модель circle и атрибут radius, где я делаю вычисления для circumference? Будет ли это в модели или контроллере, и как она может выглядеть? circumference должен быть доступен в моем views.

Кроме того, я был бы прав, если подумать, что мне не нужно делать circumference атрибут той части моей модели/базы данных, поскольку она может быть получена из пользовательского ввода radius?

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