2010-06-25 9 views
5

मैं 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 देता है : स्टैक स्तर बहुत गहरा "त्रुटि जब मैं उपयोगकर्ता करता हूं। 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

यह काम करता है। धन्यवाद! तुम मेरा समय बचाओ –

संबंधित मुद्दे