2012-09-01 19 views
6

Mam więc tablicę zbudowaną przez kolekcję.Dołączanie tablicy kolekcji z unikatowymi wartościami

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

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

buduje ..

=> [ "F03", "F04"]

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

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

buduje ..

=> [ "F01 "," f03 "]

Chcę tylko dodać kolekcję, aby zbudować tablicę zarówno z wersji v03, jak i wersji 04, aby wyglądała tak.

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

A potem tylko utrzymuje unikalne wartości tak, że wygląda to tak.

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

wyjąć F03, ponieważ został wymieniony dwukrotnie.

+0

Czy kolejność ma znaczenie? –

+0

Używasz Railsów, które zakładam? –

Odpowiedz

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

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

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

Dzięki nie zdawałem sobie sprawy, że to było takie proste. Co jeśli pierwszy został zapisany w zmiennej car1 a drugi car2. Jak zrobiłbyś to samo, używając zmiennych? –

+0

@ TonyHassan, zobacz aktualizację – megas

+0

Nie ważne, jak działa ujednolicenie. Dzięki! –

2

Dlaczego nie połączyć połączeń where w jeden?

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

lub ewentualnie

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

Pierwszy ma więcej pracy w Ruby, drugi w SQL.

+0

To jest solidna alternatywa! –

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 

Jeśli używasz szyny 3,2

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

W szyn 3 Myślę, że to powinno działać

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

Dziękuję za to, że to jest idealne! –

+0

@ TonyHassan, używasz szyn lub aktywnego rekordu? jeśli tak, jaka wersja? – PriteshJ

+0

@ TonyHassan sprawdź zaktualizowaną odpowiedź, jeśli używasz szyn lub aktywnego rekordu – PriteshJ

3

Jest to najlepszy sposób, aby to zrobić: Relation.where(part: ['v03', 'v04']).uniq.pluck(:car)

Oto pełny przykład:

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

Niektóre myśli:

Nie wkładać asperands przed zmiennych, chyba że chcesz je mieć zmienne instancji (np @a powinien wyraźnie być a - i nawet wtedy, lepsze imię byłoby dobre. Prawdopodobnie pozbyłbym się go w całości, jak pokazano powyżej).

Lepiej jest używać zrywać niż mapy, ponieważ tylko oskubać wybiera odpowiednie dane: SELECT car FROM "relations" WHERE "relations"."part" = 'v04' vs SELECT "relations".* FROM "relations" WHERE "relations"."part" = 'v04'

Lepiej jest używać .uniq na ActiveRecord :: Relacja ponieważ porusza wyjątkowość do bazy danych, a niż próba zrobienia tego w pamięci z Ruby: SELECT DISTINCT car FROM "relations" WHERE "relations"."part" IN ('v03', 'v04')

+0

Dzięki za radę! –