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