2012-09-01 7 views
6

तो मेरे पास संग्रह द्वारा निर्मित एक सरणी है।अद्वितीय मानों के साथ एक संग्रह सरणी जोड़ना

@a = Relation.where(part: "v04") 

@relations = @a.collect {|x| x.car} 

बनाता है ..

=> [ "F03", "F04"]

@a = Relation.where(part: "v03") 

@relations = @a.collect {|x| x.car} 

बनाता है ..

=> [ "F01 "," f03 "]

जो मैं चाहता हूं वह संग्रह को जोड़ना है ताकि मैं v03 और v04 दोनों से एक सरणी बना सकूं ताकि ऐसा दिखाई दे।

=> [ "F03", "F04", "F01", "F03"]

और इतना है कि यह इस तरह दिखता है तो केवल अनन्य मान रहता है।

=> [ "F03", "F04", "F01"]

के बाद से यह दो बार सूचीबद्ध किया गया F03 बाहर ले।

+0

क्या ऑर्डर मायने रखता है? –

+0

क्या आप रेल का उपयोग कर रहे हैं मुझे लगता है? –

उत्तर

19
["f03", "f04"] | ["f01", "f03"] #=> ["f03", "f04", "f01"] 

car1 = ["f03", "f04"] 
car2 = ["f01", "f03"] 

car1 | car2 #=> ["f03", "f04", "f01"] 
+0

धन्यवाद यह नहीं पता था कि यह इतना आसान था। क्या होगा अगर पहले परिवर्तनीय कार 1 और दूसरी कार 2 में संग्रहीत किया गया था। चर का उपयोग करके आप वही काम कैसे करेंगे? –

+0

@ टोनीहासन, अद्यतन – megas

+0

देखें यूनियन कार्य कभी भी ध्यान न दें। धन्यवाद! –

2

where कॉल क्यों नहीं जोड़ते?

cars = Relation.where(part: ['v03', 'v04']).map(&:car).uniq 

या संभवतः

car_ids = Relation.where(part: ['v03', 'v04']).select('DISTINCT car_id').map(&:car_id) 
cars = Car.where(id: car_ids) 

पहले रूबी में अधिक काम करता है, एसक्यूएल में दूसरा।

+0

धन्यवाद यह एक ठोस विकल्प है! –

3
@a = Relation.where(part: "v04") 
@relations1 = @a.collect {|x| x.car} 


@a = Relation.where(part: "v03") 
@relations2 = @a.collect {|x| x.car} 


@all_relations = @relations2 | @relations2 

आप रेल 3,2

parts = ['v03','v04'] 
@relations = Relation.where(part: parts).pluck(:name).uniq 

रेल 3 में मुझे लगता है कि यह काम करना चाहिए

@relations = Relation.where(part: parts).collect(&:name).uniq 
+0

बहुत धन्यवाद यह बिल्कुल सही है! –

+0

@ टोनीहासन, क्या आप रेल या सक्रिय रिकॉर्ड का उपयोग कर रहे हैं? यदि हाँ क्या संस्करण? – PriteshJ

+0

@ टोनीहसन अद्यतन उत्तरों की जांच करें यदि आप रेल या सक्रिय रिकॉर्ड – PriteshJ

3

यह यह करने के लिए सबसे अच्छा तरीका है उपयोग कर रहे हैं: Relation.where(part: ['v03', 'v04']).uniq.pluck(:car)

यहाँ एक पूर्ण उदाहरण:

require 'active_record' 

ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:' 

ActiveRecord::Schema.define do 
    self.verbose = false 
    create_table :relations do |t| 
    t.string :part 
    t.string :car 
    end 
end 

Relation = Class.new ActiveRecord::Base 

# build the relations (btw, this name makes no sense) 
Relation.create! car: 'f01', part: 'v03' 
Relation.create! car: 'f03', part: 'v03' 
Relation.create! car: 'f03', part: 'v04' 
Relation.create! car: 'f04', part: 'v04' 

# querying 
Relation.where(part: "v04").pluck(:car) # => ["f03", "f04"] 
Relation.where(part: "v03").pluck(:car) # => ["f01", "f03"] 
Relation.where(part: ['v03', 'v04']).uniq.pluck(:car) # => ["f01", "f03", "f04"] 

कुछ विचार:

अपने चर के सामने asperands न रखें जब तक आप उन्हें उदाहरण चर होना चाहते हैं (उदाहरण के लिए @a स्पष्ट रूप से a होना चाहिए - और फिर भी, एक बेहतर नाम अच्छा होगा। ऊपर दिखाए गए अनुसार मैं शायद इसे पूरी तरह से छुटकारा पाता हूं)।

यह नक्शे से प्लक उपयोग करने के लिए बेहतर है क्योंकि प्लक केवल प्रासंगिक डेटा का चयन करता है: SELECT car FROM "relations" WHERE "relations"."part" = 'v04' बनाम SELECT "relations".* FROM "relations" WHERE "relations"."part" = 'v04'

यह ActiveRecord पर .uniq उपयोग करने के लिए बेहतर है :: संबंध है क्योंकि यह डेटाबेस में विशिष्टता ले जाता है बल्कि रूबी के साथ मेमोरी में ऐसा करने की कोशिश करने से: SELECT DISTINCT car FROM "relations" WHERE "relations"."part" IN ('v03', 'v04')

+0

आपकी सलाह के लिए धन्यवाद! –

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