Rails - Где мне рассчитать производные атрибуты? - PullRequest
10 голосов
/ 22 марта 2012

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

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

1 Ответ

14 голосов
/ 22 марта 2012

Логика для вычисления производного атрибута абсолютно принадлежит модели. Окружность - это свойство самого круга, а не то, как вы представляете его в веб-интерфейсе.

Чтобы получить доступ к окружности из любого места, просто определите метод в классе, например:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...