2012-09-01 16 views
6

Así que tengo una matriz construida por recopilación.Agregar una matriz de recopilación con valores únicos

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

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

Construye ..

=> [ "F03", "F04"]

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

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

Construye ..

=> [ "f01 "," f03 "]

Lo que quiero es anexar la recopilación para que pueda crear una matriz tanto de v03 como de v04 para que se vea así.

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

Y entonces sólo mantiene valores únicos para que se vea como este.

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

Saque F03 ya que estaba en la lista dos veces.

+0

¿El pedido es importante? –

+0

¿Está utilizando Rails, supongo? –

Respuesta

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

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

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

Gracias no me di cuenta que era así de simple. ¿Qué pasa si el primero se almacenó en la variable car1 y el segundo car2? ¿Cómo harías lo mismo usando variables? –

+0

@TonyHassan, consulte la actualización – megas

+0

No importa que la unión funcione. ¡Gracias! –

2

¿Por qué no combinar las llamadas where en una?

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

o posiblemente

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

La primera hace más trabajo en Rubí, la segunda en SQL.

+0

¡Gracias esta es una alternativa sólida! –

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 

Si está utilizando rieles 3.2

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

En los carriles 3 Creo que esto debería funcionar

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

¡Muchas gracias esto es perfecto! –

+0

@TonyHassan, ¿está utilizando rieles o registro activo? si es así, ¿qué versión? – PriteshJ

+0

@TonyHassan compruebe la respuesta actualizada si está utilizando los rieles o registro activo – PriteshJ

3

Ésta es la mejor manera de hacer esto: Relation.where(part: ['v03', 'v04']).uniq.pluck(:car)

Aquí un ejemplo completo:

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

Algunos pensamientos:

No ponga asperands frente a las variables a menos que quiera que sean las variables de instancia (por ejemplo, @a claramente debe ser a - e incluso entonces, un mejor nombre sería bueno. Probablemente me deshaga de él por completo como se muestra arriba).

Es mejor utilizar desplume de mapa, debido a desplumar sólo selecciona los datos relevantes: SELECT car FROM "relations" WHERE "relations"."part" = 'v04' vs SELECT "relations".* FROM "relations" WHERE "relations"."part" = 'v04'

Es mejor utilizar .uniq en el ActiveRecord :: Relation porque se mueve la singularidad en la base de datos en vez que intentar hacerlo en la memoria con Ruby: SELECT DISTINCT car FROM "relations" WHERE "relations"."part" IN ('v03', 'v04')

+0

¡Gracias por su asesoramiento! –

Cuestiones relacionadas