2012-05-29 10 views
6

रेल 3.2.3 का उपयोग करते हुए, मेरे पास उपयोगकर्ता और संदेश मॉडल हैं। प्रत्येक संदेश का स्वामित्व किसी उपयोगकर्ता द्वारा होता है, और प्रत्येक संदेश में वैकल्पिक_user फ़ील्ड होता है जो उपयोगकर्ता.आईडी भी लेता है।रेल सक्रिय ActiveRecord गलत विदेशी कुंजी बनाता है यदि दो मॉडल हैं समान मॉडल

एप्लिकेशन/मॉडल/user.rb

class User < ActiveRecord::Base 
    has_many :messages, :foreign_key => "owner_id",  :inverse_of => :owner 
    has_many :messages, :foreign_key => "from_user_id", :inverse_of => :from_user 
end 

एप्लिकेशन/मॉडल/message.rb

class Message < ActiveRecord::Base 
    belongs_to :owner, :class_name => "User", :inverse_of => :messages 
    validates :owner, :presence => true # Every message must have an owner_id 

    belongs_to :from_user, :class_name => "User", :inverse_of => :messages 
end 

समस्या मैं दिखाई दे रही है .build विधि के साथ है। .build का उपयोग करने का मुख्य कारण एक (संभावित रूप से संरक्षित) विदेशी कुंजी को तुरंत चालू करना है, है ना? (सक्रिय रिकॉर्ड संघों पर Rails Guide देखें: "उनके विदेशी कुंजी के माध्यम से लिंक बनाया जाएगा।") लेकिन जब मैं

@message = @user.messages.build(<accessible attributes>) 

मैं लगता है कि यह वैकल्पिक from_user में भरने और है अनिवार्य owner नहीं चला ।

क्या नियंत्रित करने का कोई तरीका है कि कौन सी विदेशी कुंजी .build भरती है? या मुझे केवल .new का उपयोग करने की आवश्यकता है और सभी विदेशी कुंजी मैन्युअल रूप से असाइन करें?

@message = Message.new(<accessible attributes>) 
@message.owner = @user 
@message.from_user = @another_user 

उत्तर

5

ActiveRecord ऐसा नहीं है कि आपके पास एक ही नाम के साथ 2 संगठन हैं। आपको एसोसिएशन नाम बदलना होगा। इसका मतलब है कि आपको class_name एटिब्यूट भी प्रदान करना होगा। शायद कुछ ऐसा:

has_many :owner_messages, :class_name => 'Message', :foreign_key => "owner_id",  :inverse_of => :owner 
has_many :user_messages, :class_name => 'Message', :foreign_key => "from_user_id", :inverse_of => :from_user 
+1

धन्यवाद, स्पॉट ऑन। और फिर यह '@ user.owner_messages.build (<सुलभ विशेषताएँ>)' बनाने के लिए है। मुझे आश्चर्य है कि क्यों, यदि रेल को अद्वितीय एसोसिएशन नाम की आवश्यकता होती है, तो यह शिकायत नहीं करता है कि वे अद्वितीय नहीं हैं? जाहिर है, यह सिर्फ अंतिम परिभाषा का उपयोग करता है - अगर मैं 'has_many: संदेशों को परिभाषित करने के लिए हुआ था: संदेश:: विदेशी_की =>" owner_id "' दूसरा, मैंने इसे कभी नहीं देखा होगा। –

+0

बस एहसास हुआ कि 'related_to' पंक्तियों में 'inverse_of' नाम बदलना चाहिए। 'belong_to: मालिक,: class_name =>" उपयोगकर्ता ",: inverse_of =>: owner_messages' और' belong_to: from_user,: class_name => "उपयोगकर्ता",: inverse_of =>: user_messages'। –

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