#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) и включать их в свой пользовательский класс. Таким образом, вы можете разделить функциональность. Дайте мне знать, если вы хотите снова ответить на вопрос с помощью концепции модуля или если вы понимаете, к чему я клоню.