如何定义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仍然可以工作吗?
答案 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
如果您愿意,您可以在“关系”表中存储其他信息,例如“母亲”或“父亲”和“儿子”或“女儿”......尽管可能更好地从“人”性别中推断出来存在。