2013-04-19 5 views
6

पर विचारक्या ActiveRecord एसोसिएशन से केवल कुछ कॉलम मांगना संभव है?

def Foo 
    has_one :user 
end 

चलो कहते हैं कि मैं केवल एक Foo के User के नाम चाहते हैं, और नहीं अन्य स्तंभों में से किसी। तो मैं

SELECT name FROM "users" WHERE "prices"."id" = 123 

चाहते हैं, लेकिन कर foo.user.name मुझे

SELECT * FROM "users" WHERE "prices"."id" = 123 

दे देंगे वहाँ संघ उपयोग करने के लिए केवल एक स्तंभ पाने के लिए किसी भी चालाक तरीका है?

User.select(:name).where(...) 

इस से सिर्फ मूल्यों वापस आ जाएगी: आप क्या कॉलम आप .Select विधि का उपयोग कर, की तरह का चयन करना चाहते निर्दिष्ट कर सकते हैं

User.where(id: foo.user_id).pluck(:name).first 

उत्तर

4

सामान्य में: यदि नहीं, तो मुझे क्या करना है नाम कॉलम आप इसे एक एसोसिएशन पर चेन कर सकते हैं, लेकिन एक उदाहरण पर नहीं। इसलिए, has_one रिलेशनशिप में, मेगागर ने अन्य उत्तरों (मोरी के हटाए गए उत्तर सहित) को कम करके इंगित किया है, इसलिए आप इसे एसोसिएशन पर नहीं ले सकते हैं (क्योंकि यह उस मामले में कोई सहयोग नहीं है)। हालांकि, अगर आप एक कस्टम गुंजाइश बना सकते हैं इस तरह:

class Foo < ActiveRecord::Base 
    has_one :bar 
    scope :bar_name, lambda {Bar.select(:name).where(:foo_id=> id)} 
end 

ऊपर अपरीक्षित है ताकि आप इसे tweak करना पड़ सकता है, लेकिन आम तौर पर उस दृष्टिकोण बोल आप की तरह कुछ करने के लिए अनुमति होगी:

foo.bar_name 

... बार से सभी कॉलम लोड किए बिना।

+0

क्या इसके लिए कोई दायरा प्रतिनिधि होगा? एक गुंजाइश आम तौर पर एक ActiveRecord :: संबंध, खाली या नहीं देता है। एक विधि अधिक उपयुक्त होगी (या प्रतिनिधि?) – MrYoshiji

+0

ठीक है, यह ActiveRecord क्वेरी विधियों की एक श्रृंखला है, इसलिए मुझे लगता है कि यह एक रिश्ते को वापस कर रहा है - इसके बारे में केवल अजीब चीज़ यह है कि यह बार क्लास पर बनाए गए संबंध को वापस कर देगी फू क्लास का - लेकिन एक बार जब आप 'some.otherthing.where()' पर गए हैं, तो आप वैसे भी ऐसा कर रहे हैं। एक विधि को परिभाषित करना हालांकि इसे पूरा करने का एक अच्छा तरीका होगा। मुझे ऐसा कुछ करने की ज़रूरत नहीं है, इसलिए मेरे पास वास्तव में संदर्भ का एक फ्रेम नहीं है जिसके लिए बेहतर होगा या क्यों। – Andrew

1

नहीं, आपके has_one के मामले में, लेकिन हाँ has_many के मामले में।

has_one एसोसिएशन के लिए लौटाई गई वस्तु एक ऐसा दायरा नहीं है जिस पर आप select जैसे has_many के साथ अतिरिक्त विधियों को श्रृंखलाबद्ध कर सकते हैं। यह मॉडल का वास्तविक उदाहरण है, और इसे तुरंत चालू करने में select * शामिल होगा।

यदि आप सिर्फ नाम चुनना चाहते हैं, तो आपको सीधे User मॉडल तक पहुंचना होगा और select का उपयोग करना होगा।

इसके विपरीत, यदि आपके Foo कई users है, तो आपको foo.users.select("name") या अन्य chainable तरीकों में से किसी भी इस्तेमाल कर सकते हैं, foo.users के रूप में एक वास्तविक ActiveRecord संघ, नहीं एक मॉडल का एक उदाहरण होगा।

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