2016-12-08 3 views
0

Как определить модель Person, чтобы любое лицо могло быть назначено родителем другого лица (как показано в консоли Rails ниже)? Какие столбцы вам нужно определить в процессе миграции, создав таблицу для Person?Рельсы ActiveRecord. как я могу справиться с принадлежностью более чем одной?

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"] 

Я unserstand чем ответ что-то около

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

Я думаю, эта ссылка должна помочь вам https://heurionconsulting.wordpress.com/2007/05/29/using-belongs_to-to-connect-different-classes/ –

ответ

1

Нет, если у вас несколько родителей, у которых может быть несколько детей, belongs_to не подходит.

Вы хотите, чтобы has_many through:..., который будет использовать таблицу соединений ... вы можете назвать это, как хотите, но relationships кажется подходящим.

Кроме того, смените класс People на класс Person, чтобы следовать правилам рельсов.

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 

Вы можете хранить дополнительную информацию в таблице «Отношения», если вы хотите, например, как «мать» или «отец» и «сын» или «дочь» ... хотя, что может быть лучше вывести из Личный секс, если таковой существует.

Смежные вопросы