2009-07-02 20 views
8

मुझे आश्चर्य है कि रेल में एकाधिक ActiveRecord ऑब्जेक्ट्स के परिणामों को गठबंधन करने का कोई प्रभावी तरीका है या नहीं। उदाहरण के लिए, मैं तीन अलग-अलग तालिकाओं में तीन अलग-अलग कॉल कर सकता हूं, और मैं परिणामों को संयुक्त करना चाहता हूं, और एक सामान्य कॉलम द्वारा क्रमबद्ध किया जाता हूं।ActiveRecord ऑब्जेक्ट्स को कैसे गठबंधन करें?

यहाँ कि उम्मीद है कि समझना आसान मेरे सवाल कर देगा एक सुपर बुनियादी कोड उदाहरण है:

@results1 = Table1.find(:all) 
@results2 = Table2.find(:all) 
@results3 = Table3.find(:all) 

@combined_results_sorted_by_date_column = (how?) 

दूसरों के द्वारा सुझाव दिया गया है, यहाँ समस्या का एक ही समाधान है।

@combined_results = @result1 + @result2 + @result3 
@combined_results.sort! {|x,y| x.date <=> y.date} 

क्या होगा यदि मैं तिथि से सॉर्ट करना चाहता हूं, लेकिन तालिका 3 दिनांक के अनुसार "बनाया_ऑन" कॉलम को संदर्भित करता है?

उत्तर

2

आप "टेबल्स" के बजाय काम नहीं करते बल्कि ऑब्जेक्ट्स के साथ काम नहीं करते हैं।

आप इस तरह से इसके बारे में सोचते हैं, यह करने के लिए कोई मतलब नहीं होगा:

@results1 = Users.find(:all) 
@results2 = Posts.find(:all) 
@results3 = Comments.find(:all) 

क्या "संयुक्त" यह के रूप का मतलब होगा?

आप जो चाहते हैं वह अलग-अलग "प्रश्नों" का उपयोग करके परिणामों को एक साथ जोड़ना है। क्या यह है?

+0

मेरे पास एक समस्या प्रबंधन अनुप्रयोग में एक समयरेखा के लिए उपयोग, संयुक्त टिप्पणियां, स्थिति, और काम करता है। – dangerousdave

+0

इस मामले में उन्हें सभी को एक विशिष्ट इंटरफ़ेस का जवाब देना होगा या एक में मैप किए जाने का एक तरीका होगा। मुख्य बिंदु यह है कि "डेटाबेस टेबल" के संदर्भ में इसके बारे में सोचने से आपको खराब डिजाइन में ले जाया जा रहा है। मैं यह इंगित करने की कोशिश नहीं कर रहा था कि आप अलग-अलग स्थानों से डेटा का उपयोग न करें, केवल पूछताछ करें कि आप इसके बारे में कैसे सोचते हैं/सोचते हैं। –

0
@combined_results = @result1 + @result2 + @result3 
@combined_results.sort! {|x,y| x.date <=> y.date} 

हालांकि यह निश्चित रूप से दुनिया में सबसे कुशल कोड नहीं हो रहा है, यह सिर्फ तुम क्या जरूरत हो सकती है।

यदि कुछ मॉडल में डेट विधि नहीं है तो मेरा सुझाव है कि आप एक बनाएं। यह उतना आसान है जितना आसान है।

def date 
    created_on 
end 
0
@results1 = Table1.find(:all) 
@results2 = Table2.find(:all) 
@results3 = Table3.find(:all) 

combined = (@results1 + @results2 + @results3).sort { |x, y| x.date <=> y.date } 
+0

क्या होगा यदि मैं तिथि से सॉर्ट करना चाहता हूं, लेकिन तालिका 3 दिनांक के अनुसार "बनाया_ऑन" कॉलम को संदर्भित करता है? बहुत धन्यवाद! – Jess

+0

आप तालिका 3 में "दिनांक()" विधि जोड़कर इसे हल कर सकते हैं जो "create_on" के मान को लौटाता है। – Ethan

14
@results1 = Table1.find(:all) 
@results2 = Table2.find(:all) 
@results3 = Table3.find(:all) 

@combined_results_sorted_by_date_column = 
    (@results1 + @results2 + @results3).sort_by(&:date) 

क्या मैं तिथि के अनुसार क्रमबद्ध करना चाहते हैं, लेकिन Table3 तारीख के रूप में "created_on" कॉलम को संदर्भित करता है तो क्या होगा?

class Table3 
    alias_method :date, :created_on 
end 

या बस

class Table3 
    alias date created_on 
end 
0

मुझे यकीन है कि क्या आपके मात्रा में डेटा की तरह हैं नहीं कर रहा हूँ, लेकिन जब यह छँटाई करने के लिए आता है, अपने डेटाबेस से आप कभी भी उपयोग कर रहा होगा "इसके बारे में एक बेहतर काम कर जाएगा आवेदन परत "कोड।

क्या आपको मॉडल ऑब्जेक्ट्स की सरणी के रूप में लौटाए गए डेटा की आवश्यकता है क्योंकि तीन टेबल शायद तीन अलग-अलग मॉडल वर्गों की मिश्रित सरणी उत्पन्न करेंगे?

डायरेक्ट-एसक्यूएल लौटने वाली पंक्तियों और कॉलम का उपयोग क्यों नहीं करते हैं और क्या डीबी डेटा को सॉर्ट करने के सभी कड़ी मेहनत करते हैं?

1

शायद आप इस उत्तर को पसंद नहीं करेंगे, लेकिन मैं कहूंगा कि आप अपने डेटाबेस स्कीमा को संशोधित करना चाहेंगे। मैं इसी तरह की स्थिति में था, और उन्हें संयोजित करने के बाद परिणामों को क्रमबद्ध करना निश्चित रूप से आप जिस तरह से जाना चाहते हैं वह नहीं है।

+1

मैं आपको विश्वास करता हूं, लेकिन क्या आप इस स्थिति को संभालने के तरीके के बारे में अधिक विशिष्ट हो सकते हैं? – iterion

0

मुझे लगता है कि आप तीन अलग-अलग प्रकार की ActiveRecord ऑब्जेक्ट्स की एक मिश्रित सरणी चाहते हैं, जो कि किसी प्रकार की तारीख से क्रमबद्ध है।

@array = (Bucket.all + Mop.all + Detergent.all).sort{|x,y| x.sort_by <==> y.sort_by} 

चूंकि आपके sort_by फ़ील्ड प्रत्येक ऑब्जेक्ट प्रकार के लिए अलग है, इसलिए आपको इसे परिभाषित करने की आवश्यकता है।

class Bucket < ActiverRecord::Base 
    def sort_by 
    cleaned_on 
    end 
end 

class Detergent < ActiverRecord::Base 
    def sort_by 
    purchased_on 
    end 
end 

आप सभी डेटा किसी एक क्वेरी यूनिअन का उपयोग कर में सॉर्ट में खींच सकता है, लेकिन आप उस से बाहर एआर वस्तुओं नहीं मिलेगा।

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