Допустим, у меня есть модель Partner
, которая представляет партнера в рекламной сети. Каждый партнер связан с комиссией, которая может быть фиксированной (в абсолютной валюте) или переменной (в процентах). Таблица partners
моделирует это с помощью столбцов commission_type
, commission_fixed
и commission_variable
. Это упрощение, на самом деле существует 7 типов комиссионных, поэтому наследование одной таблицы или нескольких моделей потребует большого количества дополнительного кода.
На мой взгляд, я хочу отобразить комиссию, например:
<div class="partner_commission"><%= partner.commission %></div>
(используя метод модели)
или
<div class="partner_commission"><%= commission(partner) %></div>
(используя вспомогательный метод)
Теперь один важный аспект, который следует отметить, заключается в том, что все приложение многоязычно, поэтому каждая строка в представлении должна быть переведена с помощью помощника I18n.translate
/ I18n.t
. Перевод содержит больше, чем просто числовой / валютный формат, поэтому необходимы специальные переводы для строки комиссии (не говоря уже о том, почему).
Метод выглядит следующим образом (упрощенная версия модели):
def commission
case self.commission_type
when 'commission_fixed'
t(:commission_fixed, :value => self.commission_fixed)
when 'commission_variable'
t(:commission_variable, :value => self.commission_variable)
end
end
Вопрос в том, где я должен реализовать метод commission
, чтобы соответствовать философии MVC, лучшим практикам и т. Д.?
Причиной помещения его в помощник будет то, что оно касается только представления данных комиссии в представлении, а не самих данных. С другой стороны, должен быть реализован вспомогательный метод, который касается только одной модели, но используется во многих представлениях, что выглядит неправильно.
Причиной включения его в модель является то, что строка комиссии может рассматриваться как производный атрибут и, следовательно, должна быть определена в модели. С другой стороны, я должен вручную включить помощники вида i18n, чтобы использовать I18n.translate
в модели, что странно.
Что вы думаете?