Куда я должен поместить код?

#ruby-on-rails

#ruby-on-rails

Вопрос:

У меня есть модели User и StoredItem:

 class UserData < ActiveRecord::Base
  has_many :stored_items, :dependent => :destroy
end

class StoredItem < ActiveRecord::Base
  belongs_to :user
  named_scope :lookup, lambda { |id| { :conditions => ['qid = ?', id]}}
end
  

Мне нужно иметь два метода для добавления и удаления элементов в StoredItem для текущего пользователя. Я помещаю этот код в пользовательскую модель:

 class UserData < ActiveRecord::Base
  has_many :stored_items, :dependent => :destroy

  def save_item(params)
    if(!self.stored_items.lookup(params[:qid]).exists?)
      item = self.stored_items.new(:sid => params[:qid],
                                   :name => params[:qti],
                                   :url => params[:qur],
                                   :group_id => params[:title],
                                   :rating => Integer(params[:rating]))
      item.save
    end
  end

  def remove_item(qid)
    item = self.stored_items.lookup(qid).first()
    item.destroy
  end
end
  

Итак, вот контроллер StoredItem:

 def save_item
  @user = UserData.find_by_login(session[:cuser])
  @user.save_item(params)
  # ...
end
  

Это хорошее архитектурное решение или будет лучше поместить этот код в модель StoredItem и передать в нее текущего пользователя?

Ответ №1:

Это хорошее архитектурное решение. Вам нужно сохранить его у пользователя, поскольку пользователь является владельцем элемента StoredItem. Пользователь несет ответственность за свои сохраненные элементы, а не наоборот.

Комментарии:

1. Спасибо, но мой пользователь отвечает за многие объекты (элементы, местоположения, контакты ….), И это имеет тенденцию к очень большой модели пользователя. Я не уверен, что это хорошо.

2. Пользовательские модели, естественно, отвечают за многое в приложениях. Если вы хотите, вы можете создавать модули (размещать их в своем каталоге lib) и включать их в свой пользовательский класс. Таким образом, вы можете разделить функциональность. Дайте мне знать, если вы хотите снова ответить на вопрос с помощью концепции модуля или если вы понимаете, к чему я клоню.