2010-06-25 10 views
5

benim Rails 2.3.8 app twitter modelini taklit etmeye çalışıyorum (yakut 1.8.7)Kendini referans Has_many: aracılığıyla özelleştirilmiş ile: Birincil anahtar konu

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 

Bu bana "SystemStackError verir User.first.linked_from yaptığımda "yığın düzeyi çok derin" hata. Kullanmamın nedeni: standart kimliğin yerine user_id, birincil anahtarımın bir dize olması gerektiğidir.

İlişkilendirmeyi yapmak için ne yapabilirim, böylece User.first.linked_from ve User.first.linked_to?

cevap

7

Ben böyle olması gerektiğine inanıyoruz: Ben bir kaç şey kaldırıldı ederken

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 

, sizin :source => :follow ve :source => :subject anahtarlamalı varmış gibi görünüyor ve bu döngüsel bir başvuru yarattı.

+0

Çalışıyor. Korku veren! Set_primary_key adında bir yöntem olduğunu hiç bilmiyordum. Teşekkür ederiz! – porkeypop

+0

çalışır. Teşekkürler! zamanımı kurtardın –

İlgili konular