2017-05-19 62 views
0

我正在創建一個家庭相冊應用程序。用戶可以登錄並創建一個「家庭」對象。一旦創建了家庭對象,用戶就可以用「成員」填充家庭。該應用程序允許您將一個成員創建爲獨立對象。第一個成員創建後,所有後來的成員必須從現有成員的顯示頁面創建。當它們被創建時,被創建的成員需要確定它與當前成員(展示頁面)的關係。關係應該是'父母','孩子'或'兄弟姐妹'。Rails - 如何在同一個表中創建對象之間的關係

我有一些極端難以解決如何做到這一點。解決方案需要同時做這些事情:

  1. 當一個新的'成員'被創建,兩個對象將有一個新的關係的記錄。
  2. 需要指定關係的類型。它不能只是「成員」屬於「成員」。它需要是「成員」#1是「成員」#2的父母。

眼下,這對成員表的模式:

create_table "members", force: :cascade do |t| 
t.string "first_name" 
t.string "last_name" 
t.string "birthplace" 
t.datetime "created_at", null: false 
t.datetime "updated_at", null: false 
t.integer "family_id" 
t.integer "parent_id" 
t.integer "child_id" 
t.integer "sibling_id" 
end 

我還沒有建立會員之間的關係的has_many還。當創建一個新的成員,我只是讓新成員的「PARENT_ID」或「child_id」或「sibling_id」等於當前成員的ID被顯示(再次,形式爲會員展示頁)

 <%= form_for [@family, @new] do |m| %> 
     <div class="form-group"> 
      <%= m.text_field :first_name, placeholder: "First Name", class: 'form-control' %> 
     </div> 
     <div class="form-group"> 
      <%= m.text_field :last_name, placeholder: "Last Name", class: 'form-control' %> 
     </div> 
     <div class="form-group"> 
      <%= m.text_field :birthplace, placeholder: "Birthplace", class: 'form-control' %> 
     </div> 
     <div class="form-group"> 
      <label>Parent</label> 
      <%= m.select :child_id, @members.collect { |m| [ m.full_name, m.id ] }, include_blank: true %> 
     </div> 
     <div class="form-group"> 
      <%= m.submit "Add", class:"btn btn-primary" %> 
     </div> 
     <% end %> 

這是一個非常愚蠢的方式來做到這一點。理想情況下,我想擁有一組單選按鈕,可以說「父母」,「兄弟」和「孩子」。用戶必須點擊其中一個按鈕,但只能點擊其中一個按鈕。當表單被提交時,當前成員和新成員之間的關係根據單擊哪個單選按鈕來建立。我目前的策略根本不更新當前成員。這種關係只能在一個方向上引用。這種方法還需要選擇其他成員......這不是我想要的。

我應該通過表使用has_many嗎?幫幫我!

+0

'我現在的方法不更新當前成員在所有'你談論哪種方法?爲什麼它不起作用,有任何錯誤或驗證?也分享你的模型 –

+0

我不是一個文字方法。我只是指我的策略。抱歉。措辭不佳。 –

回答

2

你確實應該使用has_many_through,因爲我會想象你需要支持多種關係......父母可以有多個孩子,所以父母中的child_id不足以處理這種情況。

class Member < ApplicationRecord 
    has_many :parent_links, class_name: 'ParentChildLink', foreign_key: :child_id 
    has_many :parents, through: :parent_links, class_name: 'Member', foreign_key: :parent_id 
    has_many :child_links, class_name: 'ParentChildLink', foreign_key: :parent_id 
    has_many :children, through: :parent_links, class_name: 'Member', foreign_key: :child_id 
end 

的「parent_child_links」表將具有

class ParentChildLink < ApplicationRecord 
    belongs_to :parent, class_name: 'Member', foreign_key: :parent_id 
    belongs_to :child, class_name: 'Member', foreign_key: :child_id 
end 
通過鐵軌,你可以做的魔力

而現在......

tommy = Member.create(name: 'Tommy') 
peter = Member.create(name: 'Peter') 

peter.children << tommy 
+0

這非常有幫助!我將如何處理這在表單方面?我仍然在學習使用這種類型的關係。謝謝! –

相關問題