कभी-कभी, आप अलग-अलग संघों के लिए अलग-अलग नामों का उपयोग करना चाहते हैं। यदि आप मॉडल पर एसोसिएशन के लिए जिस नाम का उपयोग करना चाहते हैं, वह मॉडल पर दिए गए आश्वाशन के समान नहीं है :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, हम रेल को मॉडल पर बुलाया एसोसिएशन के:breedsDog लिए देखने के लिए कह रहे हैं (जैसा कि मॉडल के लिए उपयोग किया जाता है :dogs), और उस का उपयोग करें।