2009-01-09 11 views
5

मैं सोच रहा हूँ क्या सबसे आसान/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 पॉप्युलेट में एक दृश्य का उपयोग करने की कोशिश कर की संभावना को खोलता है। एक मामले में, स्थिति वहां होगी, और दूसरी तरफ, यह नहीं होगा।

किसी को भी इस के लिए एक अच्छा समाधान है?

धन्यवाद।

उत्तर

0

आप कुछ इस तरह कर सकते हैं:

# which is basically same as your "frustrating way" of doing it 
@item.catalog_items.find_by_catalogue_id(@item.catalogs.first.id).position 

या आप इसे में लपेट कर सकते हैं आइटम मॉडल का एक उदाहरण विधि में:

def position_in_first_catalogue 
    self.catalog_items.find_by_catalogue_id(self.catalogs.first.id).position 
end 

और फिर बस इसे इस तरह कहते हैं:

@item.position_in_first_catalogue 
+1

उदाहरण विधि काम करता है, लेकिन यह अभी भी वैसे ही जैसे वहाँ एक बेहतर तरीका होना चाहिए लगता है। मैं विशेष रूप से पहली सूची नहीं चाहता था, मैं बस इसे एक उदाहरण के रूप में उपयोग कर रहा था। मुझे लगता है कि आप @ item.position_in_catalog (catalog_id) कर सकते हैं। – arjun

+0

हां, इसे @ otem.position_in_catalog (कैटलॉग) के लिए पुनः लिखना वाकई आसान है। हालांकि, मुझे कोई अन्य तरीका नहीं दिख रहा है कि आप जो भी चाहते हैं उसे कार्यान्वित कर सकते हैं। –

+0

@ item.catalogs.first.position <- यह किसी भी स्थिति को बिल्कुल निर्दिष्ट नहीं करता है। @ Item.catalogs के साथ आप बस सभी कैटलॉग का सबसेट निर्दिष्ट करते हैं, जिससे आप पहले को चुनते हैं।तो, आप जो खत्म कर रहे हैं वह सिर्फ एक कैटलॉग है, जो आपको प्राप्त करने के तरीके के बारे में अज्ञेयवादी है। –

-1

आप @ catalog.catalog_item.position करने के लिए यदि आप संघ के दूसरे छोर प्रदान सक्षम होना चाहिए।

class Catalog < ActiveRecord::Base 
    belongs_to :catalog_item 
end 

अब आप Catalog.first.catalog_item.position कर सकते हैं।

+0

कैटलॉग_मैनी कैटलॉग_इटम्स और कैटलॉग_इटम्स के माध्यम से है_मेनी आइटम हैं, इसलिए यह काफी नहीं है जो मैं देख रहा था .. हालांकि। – arjun

+0

यह has_many द्वारा व्यक्त किए गए कई से अधिक रिश्तों के लिए काम नहीं करेगा: के माध्यम से। –

-2

क्यों तुम बस

@item = Item.find(4) 
position = @item.catalog_items.first.position 

कारण है कि आप सूची के माध्यम से जाना है नहीं है? इससे पहले कि आप किसी भी सूची की तलाश में हैं, यह मुझे कोई समझ नहीं आता है !?

+0

मुझे यकीन नहीं है कि "पहले किसी भी कैटलॉग" से आपका क्या मतलब है। वैसे भी, मैं पहली सूची की तलाश नहीं कर रहा हूं - यह सिर्फ एक उदाहरण था। कहें कि एक आइटम में 50 कैटलॉग हैं और मैं सूची # 6823 में आइटम की स्थिति चाहता हूं .. – arjun

+0

मेरा मतलब है, ऐसा लगता है कि आपको वर्तमान आइटम के लिए catalog_items से केवल पहली स्थिति की आवश्यकता है और कैटलॉग इस क्वेरी के लिए आवश्यक नहीं हैं। – aivarsak

+0

आप नहीं जानते कि आप किस स्थिति में catalog_items से चाहते हैं। यदि कोई आइटम 50 कैटलॉग से संबंधित है और आप 47 वें कैटलॉग में इसकी स्थिति चाहते हैं (लेकिन पता नहीं है कि कैटलॉग किस क्रम में हैं) तो आपको कैटलॉग की आवश्यकता है। – arjun

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