2010-06-25 2 views
5

Я пытаюсь подражать модели щебетать в моем Rails 2.3.8 приложения (рубин 1.8.7)самосправочные has_many: через с настраиваемым: первичным ключом вопрос

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?

ответ

7

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

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 были переключены и создал циклическую ссылку.

+0

Это работает. Потрясающие! Я никогда не знал, что есть метод, называемый set_primary_key. Спасибо! – porkeypop

+0

это работает. благодаря! вы меняете время –

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