2009-10-18 6 views
13

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

टेबल लगता है:

Country City 

Germany Aachen 
USA  Amarillo 
USA  Austin 

परिणाम:

Keyword Sideinfo 

Aachen Germany 
USA  Country 
Austin USA 
Germany Country 
मूल रूप से अगर वहाँ क्योंकि मैं तो दो अलग-अलग प्रश्नों का उपयोग करने के लिए उन्हें जोड़ने के लिए किया था यह करने के लिए अधिक संक्षिप्त तरीका है मैं सोच रहा हूँ

एक साथ, उन्हें सॉर्ट आदि (जो ठीक काम करता है):

def self.ajax(search) 
    countries = Location.find(:all, :select=> 'country AS keyword, "Country" AS sideinfo', :joins => :hotels, :conditions => [ 'hotels.email IS NOT NULL AND country LIKE ?', "#{search}%" ], :group => :country) 
    cities = Location.find(:all, :select=> 'city AS keyword, country AS sideinfo', :joins => :hotels, :conditions => [ 'hotels.email IS NOT NULL AND city LIKE ?', "#{search}%" ], :group => :city) 
    out = cities + countries 
    out = out.sort { |a,b| a.keyword <=> b.keyword } 
    out.first(8) 
    end 

मैं इस पर कोई जानकारी नहीं मिली है कि कैसे करने के लिए ActiveRecord का उपयोग कर संघ ...

+1

यह प्रश्न डि ActiveRecord में उपयोग करने के लिए cusses तरीकों या नकली संघों: http://stackoverflow.com/questions/6686920/activerecord-query-union –

उत्तर

7

एक यूनियन क्वेरी करना ActiveRecord के साथ संभवतः संभव नहीं है। तो दो समाधान हैं:

  • अपनी क्वेरी को बनाने के लिए find_by_sql का उपयोग करके। मैं इसके लिए सलाह नहीं दूंगा।
  • यूनियन एसक्यूएल क्वेरी करने के लिए union जैसी प्लगइन का उपयोग करना।
+4

संघ अब 3 साल पुराना है। किसी को भी अद्यतित समाधान –

+0

@ बिललिपर मिला है, हालांकि आपकी टिप्पणी '12 में पोस्ट की गई थी, अगर आप अभी भी इसकी तलाश कर रहे हैं तो मेरा उत्तर देखें –

+0

@ बिललीपर https://github.com/brianhempel/active_record_union एक बेहतर मणि है। बिना कुरूपता के ActiveRecord scopes पर यूनियनों का उपयोग करें। – lingceng

2

संघ प्लगइन का उपयोग करना, यह अब खूबसूरती से धन्यवाद काम करता है:

def self.ajax3(search) 
    Location.union([{ :select => 'city AS keyword, country AS sideinfo', 
         :joins => :hotels, 
         :conditions => [ 'email IS NOT NULL AND city LIKE ?', "#{search}%" ]}, 
        { :select => 'country AS keyword, "Country" AS sideinfo', 
         :joins => :hotels, 
         :conditions => [ 'email IS NOT NULL AND country LIKE ?', "#{search}%" ]}]) 
    end 
3

मैं चयन का उपयोग कर एक स्वच्छ हैक पाया। उदाहरण के लिए यदि आप उपयोगकर्ता और अन्य उपयोगकर्ता के बीच एक संघ बनाना चाहते हैं।

User.select('id from other_users union select id') 

इस इस एसक्यूएल उत्पन्न होगा

"SELECT id from other_users union select id FROM users " 

आप ActiveRecord :: रिलेशन उपयोग कर सकते हैं आप शर्तों के साथ स्कोप है, तो where_values ​​विधि

condition = OtherUser.example_condtion_scope.where_values.join(' ') 
User.select("id from other_users where #{contition}") 
1

इस रेल 4 में अब संभव है ,

locations = Location.arel_table 
hotels = Hotel.arel_table 

countries = Location 
       .select(locations[:country].as("keyword")) 
       .joins(:hotels) 
       .where(hotels[:email].not_eq(nil)) 
       .where(locations[:country].matches("#{search}%")) 

cities = Location 
      .select(locations[:city].as("keyword")) 
      .joins(:hotels) 
      .where(hotels[:email].not_eq(nil)) 
      .where(locations[:city].matches("#{search}%")) 

union = countries.union(cities) 

result = Location.from(locations.create_table_alias(union, :locations).to_sql) 
संबंधित मुद्दे