簡體   English   中英

Rails最佳實踐:模型中的關聯對象創建

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM