[英]Rails Best practices : associated object creation in model
我大張旗鼓地有3個表:用戶(電子郵件,密碼),聯系人(名稱,電話),關系(user_id,contact_id,級別)。
當用戶創建新聯系人時,我希望他與之關聯。 該協會的“友誼”級別為1到3。
我使用一種形式在我的contacts#create控制器中輸入級別。
現在,我有這個很棒
def create
@contact = Contact.new(params[:contact])
if @contact.save
#@relation = Relation.new(:user_id => current_user.id, :contact_id => @contact.id, :level => params[:relation])
#@relation.save
redirect_to root_url, :notice => "ok!"
else
render "new"
end
end
我當時正在考慮將關系創建移到我的聯系人模型中,以執行以下操作:
after_create { Relation.create(user_id: current_user.id, contact_id: self.id, level: params[:relation]) }
當然,這是行不通的,但是您知道了。 可以在模型中做到這一點還是可以像現在一樣保留它
干杯
像這樣嗎 基本上,只需創建關系並聯系與current_user關聯的所有對象。
current_user.relations.create(contact:Contact.new(params [:contact]),級別:params [:relation])
不要將其移至after_create。 如果有的話,可以在某個地方創建一個接受用戶,聯系人和關系的功能。
我寧願將它保留在控制器中。 為了進行測試(以及可能用於其他目的),您可能不希望將用戶和聯系人緊密地綁在一起。 我看到的方式是,控制器是將創建邏輯聯系在一起的地方,而模型中的after_create
之類的方法更多地是設置某些參數,而不是創建新的關聯,而在將來您可能並不需要。
tl; dr-在控制器中放置類似這樣的內容會使兩個模型緊密結合在一起。
contact.rb
has_one :relation
accepts_nested_attributes_for :relation
關系
belongs_to :contact
belongs_to :user
像這樣的意見
= for_form @contact do |f|
= f.fields_for :relation do |r|
= r.text_field :level
= f.submit 'create'
控制器新動作
@contact = Contact.new
@contact.build_relation # create new relation object for the contact
控制器創建動作
@contact = Contact.new(params[:contact])
@contact.relation.user = current_user
@contact.save
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.