मैं सोच रहा हूँ क्या सबसे आसान/has_many में मॉडल में शामिल होने से गुण का चयन करने की सबसे खूबसूरत तरीका में शामिल हो।has_many से सुंदर ढंग से का चयन गुण: संघों के माध्यम से है: के माध्यम से रेल में मॉडल
चलें कहते हैं कि हम आइटम, कैटलॉग, और निम्न वर्ग के साथ आइटम CatalogItems है:
class Item < ActiveRecord::Base
has_many :catalog_items
has_many :catalogs, :through => :catalog_items
end
साथ ही, की सुविधा देता है का कहना है कि CatalogueItems की स्थिति विशेषता है और किसी भी सूची और किसी भी आइटम के बीच केवल एक ही CatalogueItem है कि वहाँ ।
सबसे स्पष्ट लेकिन थोड़ा निराशा रास्ता स्थिति विशेषता को पुनः प्राप्त करने के लिए है:
@item = Item.find(4)
@catalog = @item.catalogs.first
@cat_item = @item.catalog_items.first(:conditions => {:catalog_id => @catalog.id})
position = @cat_item.position
यह कष्टप्रद है, क्योंकि ऐसा लगता है कि हम @ item.catalogs.first.position करने के लिए के बाद से हम पूरी तरह से है में सक्षम होना चाहिए निर्दिष्ट करें कि हम कौन सी स्थिति चाहते हैं: वह जो @ आइटम के कैटलॉग के पहले से मेल खाता है।
एक ही रास्ता है कि मैं इस पाने के लिए मिल गया है है:
class Item < ActiveRecord::Base
has_many :catalog_items
has_many :catalogs, :through => :catalog_items, :select => "catalogue_items.position, catalogs.*"
end
अब मैं Item.catalogs.first.position कर सकते हैं। बहरहाल, यह एक हैक का एक सा की तरह लगता है - मैं एक सूची उदाहरण पर एक अतिरिक्त विशेषता जोड़ रहा। यह भी दो अलग-अलग स्थितियों में, जहां मैं एक Catalog.find के साथ या एक @ item.catalogs साथ @catalogs पॉप्युलेट में एक दृश्य का उपयोग करने की कोशिश कर की संभावना को खोलता है। एक मामले में, स्थिति वहां होगी, और दूसरी तरफ, यह नहीं होगा।
किसी को भी इस के लिए एक अच्छा समाधान है?
धन्यवाद।
उदाहरण विधि काम करता है, लेकिन यह अभी भी वैसे ही जैसे वहाँ एक बेहतर तरीका होना चाहिए लगता है। मैं विशेष रूप से पहली सूची नहीं चाहता था, मैं बस इसे एक उदाहरण के रूप में उपयोग कर रहा था। मुझे लगता है कि आप @ item.position_in_catalog (catalog_id) कर सकते हैं। – arjun
हां, इसे @ otem.position_in_catalog (कैटलॉग) के लिए पुनः लिखना वाकई आसान है। हालांकि, मुझे कोई अन्य तरीका नहीं दिख रहा है कि आप जो भी चाहते हैं उसे कार्यान्वित कर सकते हैं। –
@ item.catalogs.first.position <- यह किसी भी स्थिति को बिल्कुल निर्दिष्ट नहीं करता है। @ Item.catalogs के साथ आप बस सभी कैटलॉग का सबसेट निर्दिष्ट करते हैं, जिससे आप पहले को चुनते हैं।तो, आप जो खत्म कर रहे हैं वह सिर्फ एक कैटलॉग है, जो आपको प्राप्त करने के तरीके के बारे में अज्ञेयवादी है। –