Ruby on rails Rails—如何在同一个表中的对象之间创建关系

Ruby on rails Rails—如何在同一个表中的对象之间创建关系,ruby-on-rails,Ruby On 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
    
    我还没有在会员之间建立很多关系。创建新成员时,我只需使该新成员的“父id”或“子id”或“兄弟id”等于当前显示成员的id(同样,表单位于成员显示页面中)

    
    父母亲
    
    在我看来,这是一种非常愚蠢的方法。理想情况下,我希望有一组单选按钮,上面写着“家长”、“兄弟姐妹”和“孩子”。用户必须单击其中一个按钮,但只能单击其中一个。提交表单时,将根据单击的单选按钮建立当前成员和新成员之间的关系。我当前的策略根本不更新当前成员。该关系只能在一个方向上引用。此方法还需要选择其他成员。。。这不是我想要的


    我应该使用has_多通表吗?救命啊

    您确实应该使用
    has\u many\u to
    ,因为我认为您需要支持多种关系。。。一个父级可以有多个子级,因此在父级中有
    子级\u 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
    
    类成员
    “父子链接”表将具有

    class ParentChildLink < ApplicationRecord
      belongs_to :parent, class_name: 'Member', foreign_key: :parent_id
      belongs_to :child, class_name: 'Member', foreign_key: :child_id
    end
    
    class ParentChildLink
    现在通过rails的魔力你可以做到

    tommy = Member.create(name: 'Tommy')
    peter = Member.create(name: 'Peter')
    
    peter.children << tommy
    
    tommy=Member.create(名称:“tommy”)
    peter=成员。创建(名称:“peter”)
    
    peter.children您确实应该使用
    has\u many\u to
    ,因为我认为您需要支持多种关系。。。一个父级可以有多个子级,因此在父级中有
    子级\u 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
    
    类成员
    “父子链接”表将具有

    class ParentChildLink < ApplicationRecord
      belongs_to :parent, class_name: 'Member', foreign_key: :parent_id
      belongs_to :child, class_name: 'Member', foreign_key: :child_id
    end
    
    class ParentChildLink
    现在通过rails的魔力你可以做到

    tommy = Member.create(name: 'Tommy')
    peter = Member.create(name: 'Peter')
    
    peter.children << tommy
    
    tommy=Member.create(名称:“tommy”)
    peter=成员。创建(名称:“peter”)
    
    peter.children
    我当前的方法根本不更新当前成员
    您在谈论哪种方法?为什么它不工作,没有任何错误或验证?也分享你的模型我不是指文字方法。我只是指我的策略。很抱歉糟糕的措辞。
    我当前的方法根本不更新当前成员
    你说的是哪种方法?为什么它不工作,没有任何错误或验证?也分享你的模型我不是指文字方法。我只是指我的策略。很抱歉糟糕的措辞。这很有帮助!我该如何处理表单方面的问题?我仍在学习如何利用这种关系。非常感谢。这很有帮助!我该如何处理表单方面的问题?我仍在学习如何利用这种关系。非常感谢。