कभी-कभी, आप अलग-अलग संघों के लिए अलग-अलग नामों का उपयोग करना चाहते हैं। यदि आप मॉडल पर एसोसिएशन के लिए जिस नाम का उपयोग करना चाहते हैं, वह मॉडल पर दिए गए आश्वाशन के समान नहीं है :through
, तो आप :source
इसे निर्दिष्ट करने के लिए उपयोग कर सकते हैं ।
मुझे नहीं लगता कि उपरोक्त अनुच्छेद डॉक्स में एक की तुलना में बहुत स्पष्ट है, इसलिए यहां एक उदाहरण है। मान लेते हैं कि हमारे पास तीन मॉडल हैं Pet
, Dog
और Dog::Breed
।
class Pet < ActiveRecord::Base
has_many :dogs
end
class Dog < ActiveRecord::Base
belongs_to :pet
has_many :breeds
end
class Dog::Breed < ActiveRecord::Base
belongs_to :dog
end
इस मामले में, हमने नाम स्थान को चुना है Dog::Breed
, क्योंकि हम Dog.find(123).breeds
एक अच्छे और सुविधाजनक संघ के रूप में पहुंचना चाहते हैं ।
अब, अगर हम अब एक has_many :dog_breeds, :through => :dogs
एसोसिएशन बनाना चाहते हैं, तो हमें Pet
अचानक एक समस्या है। रेल :dog_breeds
पर एक एसोसिएशन खोजने में सक्षम नहीं होगा Dog
, इसलिए रेल संभवतः यह नहीं जान सकती कि आप किस Dog
एसोसिएशन का उपयोग करना चाहते हैं। दर्ज करें :source
:
class Pet < ActiveRecord::Base
has_many :dogs
has_many :dog_breeds, :through => :dogs, :source => :breeds
end
के साथ :source
, हम रेल को मॉडल पर बुलाया एसोसिएशन के:breeds
Dog
लिए देखने के लिए कह रहे हैं (जैसा कि मॉडल के लिए उपयोग किया जाता है :dogs
), और उस का उपयोग करें।