2012-09-01 27 views
6

Topladığımız bir dizi var.Benzersiz değerler içeren bir toplama dizisi ekleme

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

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

..

=> [ "F03", "F04"]

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

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

oluşturur ..

=> [ "F01 oluşturur "," f03 "]

İstediğim şey, toplamalara eklemek, böylece v03 ve v04'ten bir dizi oluşturabilmem için böyledir.

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

Ve şuna benzer şekilde daha sonra yalnızca benzersiz değerler tutar.

=> iki kez yer aldı beri [ "F03", "F04", "f01"]

F03 çıkar.

+0

Sipariş önemlidir? –

+0

Varsadığım Rails kullanıyorsunuz? –

cevap

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

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

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

Teşekkürler, bu kadar basit olduğunu fark etmedi. Ya ilk değişkeni car1 ve ikinci car2'de saklandıysa. Değişkenleri kullanarak aynı şeyi nasıl yaparsınız? –

+0

@TonyHassan, güncellemeye bakın – megas

+0

Birlik işe yaramaz. Teşekkürler! –

2

Neden bir araya where çağrıları birleştirmek değil?

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

veya muhtemelen

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

ilk Ruby daha çalışır, SQL ikinci.

+0

Teşekkürler bu katı bir alternatif! –

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 

Eğer raylar raylar 3'te 3,2

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

Bunu bu bunu yapmanın en iyi yoludur

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

THanks bu çok mükemmel! –

+0

@TonyHassan, ray veya aktif kayıt kullanıyor musunuz? eğer evet, hangi versiyon? – PriteshJ

+0

@TonyHassan Eğer raylar veya aktif kayıt – PriteshJ

3

çalışması gerektiğini düşünüyorum kullanıyorsanız: Relation.where(part: ['v03', 'v04']).uniq.pluck(:car)

İşte tam bir örnek:

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"] 

Bazı düşünceler:

bunları örnek değişkenler olmak istemedikçe

değişkenlerinizin önüne asperands koymayın (örn @a açıkça a olmalıdır - ve daha sonra, daha iyi bir isim iyi olurdu. Muhtemelen yukarıda gösterildiği gibi tamamen ondan kurtulmak istiyorum).oldukça veritabanına benzersizliğini hamle çünkü SELECT car FROM "relations" WHERE "relations"."part" = 'v04' O ActiveRecord üzerinde .uniq kullanmak daha iyidir SELECT "relations".* FROM "relations" WHERE "relations"."part" = 'v04'

vs :: İlişkisi: koparmak yalnızca alakalı verileri seçer çünkü

haritadan daha koparmak kullanmak daha iyidir Ruby ile bellekte yapmaya çalışmaktan daha: SELECT DISTINCT car FROM "relations" WHERE "relations"."part" IN ('v03', 'v04')

+0

Tavsiyeniz için teşekkürler! –

İlgili konular