Как получить список всех родителей из таблицы отношений - PullRequest
1 голос
/ 12 июля 2011

Я использую Ruby on Rails 3.0.9.Я пытаюсь получить список всех родителей из таблицы отношений.Вот код.

require 'rubygems'
gem 'activerecord', '3.0.9'
require 'active_record'

ActiveRecord::Base.establish_connection( :adapter  => 'sqlite3', 
                                         :database => ':memory:')

ActiveRecord::Schema.define do
  create_table :people, :force => true do |t|
  end
  create_table :relationships, :force => true do |t|
    t.integer :parent_id
    t.integer :child_id
  end
end

class Person < ActiveRecord::Base
end

class Relationship < ActiveRecord::Base
  belongs_to :parent,   :class_name => 'Person'
  belongs_to :child,    :class_name => 'Person'
end

child = Person.create!
parent = Person.create!
Relationship.create!(:parent_id => parent.id, :child_id => child.id)

# Person.parents_list needs to be implemented and 
# I am stuck and do not know how to get to that
assert 1, Person.parents_list.size 
assert parent.id, Person.parents_list.first.id

1 Ответ

0 голосов
/ 12 июля 2011

Вы можете использовать самоссылочные отношения многие ко многим:

class Person < ActiveRecord::Base
  has_many :relationships,
           :foreign_key => 'child_id'
  has_many :parents,
           :through => :relationships,
           :source  => :child

end

child.parents.count  # -> 1

Эта запись в блоге содержит более подробную информацию.

Отредактировано, чтобы добавить: Ах, вы просто хотите, чтобы каждый человек, который является родителем. Вы можете запросить это:

class Person < ActiveRecord::Base
  has_many :parent_relationships,
           :class_name => 'Relationship',
           :foreign_key => 'parent_id'
end

Person.joins(:parent_relationships).count # -> 1

При объединении с таблицей Отношений вы получите только записи Person с соответствующими Отношениями (внутреннее соединение). Это покрыто превосходными направляющими Rails.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...