2017-05-19 63 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

这非常有帮助!我将如何处理这在表单方面?我仍然在学习使用这种类型的关系。谢谢! –

相关问题