2012-09-01 33 views
6

所以我有一個由collect構建的數組。追加具有唯一值的收集數組

@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

你正在使用Rails我認爲? –

回答

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

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

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

謝謝你沒有意識到這很簡單。如果第一個存儲在變量car1和第二個car2中,該怎麼辦?你將如何使用變量來做同樣的事情? –

+0

@TonyHassan,查看更新 – 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) 

第一確實在Ruby的更多的工作,第二次在SQL。

+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 

在Rails 3,我認爲這應該工作

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

THANKs很多這是完美的! –

+0

@TonyHassan,你使用rails還是活動記錄?如果是的是什麼版本? – PriteshJ

+0

@TonyHassan檢查更新的答案,如果您正在使用rails或活動記錄 – 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' VS SELECT "relations".* FROM "relations" WHERE "relations"."part" = 'v04'

這是更好地在使用的ActiveRecord :: .uniq關係,因爲它移動到獨特的數據庫,而比嘗試在Ruby的內存中做到這一點:SELECT DISTINCT car FROM "relations" WHERE "relations"."part" IN ('v03', 'v04')

+0

感謝您的諮詢! –