2010-11-14 8 views
19
  1. ऐसे has_many और belongs_to द्वारा परिभाषित उन लोगों के रूप

    Do संघ के तरीकों, उपयोग ActiveRecord::Relation संभव है?यह एक संघ के लिए ActiveRecord :: रिलेशन वस्तु पाने के लिए

  2. यदि हां, तो ActiveRecord::Relation ऑब्जेक्ट का उपयोग किया जा रहा है।

हम सब जानते हैं कि रेल 3 भारी ActiveRecord::Relation वस्तुओं, और पृष्ठभूमि में Arel::Relation वस्तुओं उपयोग कर रहा है, जब Query Interface का उपयोग करके क्वेरी बना रहे हैं। जब भी हम select, joins, क्वेरी इंटरफ़ेस के विधियों का उपयोग करते हैं, तो ActiveRecord::Relation ऑब्जेक्ट वापस आ जाता है। हालांकि, यह मॉडल की एसोसिएशन विधि को कॉल करते समय ऐसा प्रतीत नहीं होता है। इसके बजाए, क्वेरी को तत्काल निष्पादित किया जाता है और एक उदाहरण, या संबंधित मॉडल के उदाहरणों की एक सरणी लौटा दी जाती है।

पर विचार करें निम्नलिखित मॉडल:

post.rb

class Post < ActiveRecord::Base 
    belongs_to :user 
end 

user.rb

class user < ActiveRecord::Base 
    has_many :posts 
end 

उदाहरण:

u = User.first 
u.posts 

012 कॉलिंगActiveRecord::Relation का एक उदाहरण नहीं, पदों की एक सरणी देता है। मुझे आश्चर्य है कि प्राप्त करना संभव है जो एसोसिएशन द्वारा उपयोग किया जा रहा है, यदि इसका उपयोग किया जा रहा है, तो शायद Arel::Table का उपयोग करके?

ActiveRecord::Relation चाहते हैं कि मेरा तर्क स्पष्ट होना चाहिए: ऐसा इसलिए है क्योंकि मैं मौजूदा संगठन को बंद करना चाहता हूं और एक अलग उद्देश्य के अनुरूप क्वेरी में हेरफेर करना चाहता हूं।

उत्तर

32

कुछ ही मिनटों मैं where(nil) हैक इस्तेमाल किया के लिए, तो मैं एक brainwave था और कुछ यादृच्छिक की कोशिश की:

User.first.posts.scoped 

यह है कि! : डी

हाँ, रेल + एरल वास्तव में खराब दस्तावेज है। उस बिंदु पर परिपक्वता करने के लिए तत्पर हैं जहां मैं वास्तव में चीजों को देख सकता हूं और वास्तविक उत्तर प्राप्त कर सकता हूं।

+0

इसे प्यार करें। बहुत साफ! मैं आपको चेकमार्क दे रहा हूं। और मैं एरियल दस्तावेज के बारे में सहमत हूं। मैं इसके बारे में सभी जगहों पर स्क्रैप्स और बिट्स पढ़ रहा हूं। यह बहुत शक्तिशाली लगता है, लेकिन अच्छे दस्तावेज़ीकरण के बिना, यह भी काफी परेशान हो सकता है। :) – John

+0

शानदार, बहुत बहुत धन्यवाद! –

+0

क्या मैंने बनाया एक कस्टम सरणी पर '.scoped' को कॉल करने का कोई तरीका है? – brittohalloran

1

वास्तव में एज गाइड दस्तावेज पढ़ने के लिए समय निकालकर, मैं Section 4.3 has_many Association Reference में उत्तर खोजने में सक्षम था। संक्षेप में, प्रलेखन ActiveRecord::Relation ऑब्जेक्ट प्राप्त करने के लिए संभव है या क्या ActiveRecord::Relation ऑब्जेक्ट का उपयोग किया जा रहा है, इस पर प्रकाश डाला नहीं गया है, लेकिन यह एसोसिएशन का पुन: उपयोग करने और इसके परिणाम को तैयार करने के तरीके के बारे में विस्तार प्रदान करता है।

धारा 4.3.1 Methods Added by has_many सूचीबद्ध करता collection.where तरीकों कि has_many संघ द्वारा जोड़ा जाता है में से एक होने के रूप में। और अनुभाग 4.3.1.11 collection.where(…) दिखाता है कि आप इसका उपयोग करेंगे जैसे कि आप क्वेरी इंटरफ़ेस की where विधि उपयोगकर्ता को करेंगे। सबसे महत्वपूर्ण बात यह है कि संग्रह पर इस विधि का उपयोग करते समय ऑब्जेक्ट्स आलसी लोड लोड हो जाती हैं, और सुनिश्चित करें कि ActiveRecord::Relation ऑब्जेक्ट वापस आ गया है।

u.posts.where("").class # => ActiveRecord::Relation 
u.posts.where("").to_sql # => SELECT `posts`.* FROM `posts` WHERE `posts`.user_id = 1 

मान्य रूप से आदर्श समाधान नहीं, लेकिन यह मुझे कुछ देता है जो मैं बंद कर सकता हूं।

3

रेल 4 में, .scope या .spawn का उपयोग CollectionProxy के बजाय संबंध ऑब्जेक्ट तक पहुंचने के लिए करें। documentation देखें।

1

एक ActiveSupport::Concern में, आप निजी विधि spawn फोन या scope या scoped उपयोग नहीं कर सकते।

मुझे इसका उपयोग करने की आवश्यकता है।

where(true) 
संबंधित मुद्दे