Самореферентный has_many: сквозной с настроенным: проблема первичного ключа - PullRequest
5 голосов
/ 25 июня 2010

Я пытаюсь эмулировать модель Twitter в моем приложении Rails 2.3.8 (ruby 1.8.7)

class Connection < ActiveRecord::Base
  belongs_to :subject, :foreign_key => 'subject_id', :primary_key => 'user_id', :class_name => 'User'
  belongs_to :follower, :foreign_key => 'follower_id', :primary_key => 'user_id', :class_name => 'User'
end

class User < ActiveRecord::Base
  has_many :relations_to, :primary_key => 'user_id', :foreign_key => 'follower_id', :class_name => 'Connection'
  has_many :relations_from, :primary_key => 'user_id', :foreign_key => 'subject_id', :class_name => 'Connection'
  has_many :linked_from, :through => :relations_from, :source => :subject, :primary_key => 'user_id'
  has_many :linked_to, :through => :relations_to, :source => :follower, :primary_key => 'user_id'
end

Это выдает ошибку «SystemStackError: уровень стека слишком глубокий», когда я выполняю User.first.linked_from. Причина, по которой я должен использовать: user_id вместо стандартного идентификатора, заключается в том, что мой первичный ключ должен быть строкой.

Что я могу сделать, чтобы отношения заработали, чтобы я мог использовать User.first.linked_from и User.first.linked_to?

1 Ответ

7 голосов
/ 25 июня 2010

Я считаю, что это должно быть так:

class Connection < ActiveRecord::Base
  belongs_to :subject, :class_name => 'User'
  belongs_to :follower, :class_name => 'User'
end

class User < ActiveRecord::Base
  set_primary_key "user_id"

  has_many :relations_to, :foreign_key => 'follower_id', :class_name => 'Connection'
  has_many :relations_from, :foreign_key => 'subject_id', :class_name => 'Connection'
  has_many :linked_from, :through => :relations_from, :source => :follow 
  has_many :linked_to, :through => :relations_to, :source => :subject
end

, хотя я удалил несколько вещей, похоже, что ваши :source => :follow и :source => :subject были переключены, и это создало круговую ссылку.

...