Rails: помощники и модели - где организовать код - PullRequest
2 голосов
/ 03 мая 2010

Все больше и больше я помещаю весь свой код в модели и помощники, касающиеся MVC.

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

Например, вот сценарий, который работает в модели или в помощнике:

 def status
  if self.purchased
   "Purchased"
  elsif self.confirmed
   "Confirmed"
  elsif self.reserved
   "Reserved"
  else
   "Pending"
  end

end

Мне не нужно сохранять этот статус, как в базе данных, потому что есть логические поля для купленных, подтвержденных и зарезервированных.Так зачем помещать это в модель или зачем использовать в качестве помощника?

Таким образом, я не уверен в том, какие наилучшие практики или преимущества можно получить при внедрении кода в модель или в помощник, если он может быть в обоих.

Ответы [ 3 ]

5 голосов
/ 03 мая 2010

Ваш конкретный пример включает бизнес-правило в том смысле, что если экземпляр модели и куплен, и подтвержден, то соответствующий статус «приобретен», а не «подтвержден»

Итак, в вашем примере я определенно поместил бы метод в модель, поскольку он кодирует одно из бизнес-правил ваших приложений.

Другой пример:

def status_string
  case status
    when 0: "Purchased"
    when 1: "Confirmed"
    else
      "Pending"
   end
end

В этом случае метод status_string может быть разумно определен либо в помощнике вида, либо в модели - он не имеет никакого отношения к каким-либо бизнес-правилам, он изменяет представление значения. Я бы добавил это в модель, так как я склонен помещать только связанные с ht sw в View Helpers. Но в зависимости от вашей схемы интернационализации подобный метод может быть лучше размещен в View Helper.

Хорошим примером помощника по представлению является метод для всего приложения, позволяющий преобразовать значения даты и времени в стандартное представление для вашего приложения. Например,

# application_helper.rb
def date_long_s(d)
  d.strftime("%A, %b *%d, %Y *%I:%M %p")
end
3 голосов
/ 03 мая 2010

Это действительно субъективно, и я согласен, иногда неясно, принадлежит ли что-то модели или помощнику.

Например:

# using model
status ? status.nice_name : "Pending" 
# using helper 
nice_name(status) 

Очевидным преимуществом для помощника является то, что он может обрабатывать ноль объектов, изящно поддерживая чистоту видов. Недостатком является то, что код теперь находится в другом месте, чем модель

По производительности вы не увидите существенной разницы между использованием помощников и моделей. Более вероятно, что обходные пути БД для извлечения объектов состояния будут узким местом.

0 голосов
/ 10 января 2011

Я использую постоянные хэши в подобных ситуациях.

Хеш определен в файле модели следующим образом

STATUS = {
 1 => "Pending",
 2 => "Confirmed" 
}

Я также объявляю константы для каждого статуса следующим образом.

ST_PENDING = 1

Объявление этого полезно при написании запросов. Например,

MyModel.all(:status=>ST_PENDING)

Поле состояния в таблице базы данных является числом. Так что при печати я просто использую это.

MyModel::STATUS[obj.status]
...