Rails ActiveRecord。我如何处理不止一个的belongs_to?

时间:2016-12-08 19:15:40

标签: ruby-on-rails activerecord belongs-to

如何定义Person模型,以便可以将任何Person指定为另一个Person的父级(如下面的Rails控制台中所示)?在为Person创建表的迁移中需要定义哪些列?

irb(main):001:0> john = Person.create(name: "John")
irb(main):002:0> jim = Person.create(name: "Jim", parent: john)
irb(main):003:0> bob = Person.create(name: "Bob", parent: john)
irb(main):004:0> john.children.map(&:name)
=> ["Jim", "Bob"]

我知道答案是什么?

class People < ActiveRecord::Base
        has_many :children, class_name: "People", foreign_key: "parent_id"
        belongs_to :parent, class_name: "People" #Question HERE? how to deal with belong_to more than one?
end

class AddXXTOXXX <ActiveRecord::Migration
            def change
                create_table :peoples do |t|
                    t.add_column :name, string
                    t.add_column :parent, string
                    t.references :parent, index: true
                    t.timestamps
                end
            end
end

但令我感到困惑的是,每个人都有两个父母(妈妈和爸爸),在这种情况下,belongs_to仍然可以工作吗?

1 个答案:

答案 0 :(得分:1)

不,如果您有多个父母可以有多个孩子,belongs_to不合适。

您希望has_many through:...使用联接表...您可以随意调用它,但relationships似乎合适。

另外,将People类更改为Person类以遵循rails约定。

class Person < ActiveRecord::Base

  has_many :ancestors, class_name: 'Relationship', foreign_key: :child_id
  has_many :descendants, class_name: 'Relationship', foreign_key: :parent_id
  has_many :parents, through: :ancestors, class_name: 'Person', foreign_key: :parent_id
  has_many :children, through: :descendants, class_name: 'Person', foreign_key: :child_id

end

如果您愿意,您可以在“关系”表中存储其他信息,例如“母亲”或“父亲”和“儿子”或“女儿”......尽管可能更好地从“人”性别中推断出来存在。