209 votes

Combiner deux objets ActiveRecord::Relation

Supposons que je possède les deux objets suivants :

first_name_relation = User.where(:first_name => 'Tobias') # ActiveRecord::Relation
last_name_relation  = User.where(:last_name  => 'Fünke') # ActiveRecord::Relation

est-il possible de combiner les deux relations pour en produire une seule ? ActiveRecord::Relation contenant les deux conditions ?

Note : Je suis conscient que je peux enchaîner les wheres pour obtenir ce comportement, ce qui m'intéresse vraiment est le cas où j'ai deux ActiveRecord::Relation objets.

0 votes

14voto

moopasta Points 1163

C'est ainsi que je l'ai "géré" si vous utilisez pluck pour obtenir un identifiant pour chacun des enregistrements, que vous joignez les tableaux ensemble et que vous effectuez finalement une requête pour ces identifiants joints :

  transaction_ids = @club.type_a_trans.pluck(:id) + @club.type_b_transactions.pluck(:id) + @club.type_c_transactions.pluck(:id)
  @transactions = Transaction.where(id: transaction_ids).limit(100)

6voto

mr.musicman Points 732

Si vous disposez d'un tableau de relations d'enregistrement actif et que vous souhaitez les fusionner toutes, vous pouvez procéder comme suit

array.inject(:merge)

1voto

J3RN Points 141

Ce n'est pas très propre, mais ça marche :

first_name_relation.each do |item|
  last_name_relation = last_name_relation << item
end

Après ce blocage, tous les éléments des deux relations seront en last_name_relation et il s'agira toujours d'une relation ActiveRecord::Relation. where y pluck ainsi que d'autres méthodes de RA.

1voto

pk-n Points 410

Dans le cas où l'utilisation de o n'est pas compactible, j'utilise quelque chose comme ceci pour obtenir l'objet ActiveRecord_Relation

User.from("(#{complex_raw_query} UNION #{complex_raw_query}) AS users")

0voto

Richard Grossman Points 741

Force brute :

first_name_relation = User.where(:first_name => 'Tobias') # ActiveRecord::Relation
last_name_relation  = User.where(:last_name  => 'Fünke') # ActiveRecord::Relation

all_name_relations = User.none
first_name_relation.each do |ar|
  all_name_relations.new(ar)
end
last_name_relation.each do |ar|
  all_name_relations.new(ar)
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X