0
votes

Requête en enregistrement actif avec un tableau de hachage

J'ai le modèle suivant dans Ruby

entities = []
accounts.each do |account|
    entities << Entity.where(account_id: ActiveSupport::HashWithIndifferentAccess.new(account)['account_id'])
    .where(account_type: ActiveSupport::HashWithIndifferentAccess.new(account)['account_type'])
end


2 commentaires

Puisque vous voulez un enregistrement pour correspondre à la fois aux attributs en même temps, je ne peux pas penser à une meilleure façon. Cependant, il peut y avoir un meilleur moyen d'accomplir tout ce que vous essayez de faire. Peut-être qu'il y a un problème avec la logique que vous avez suivie qui vous a amené à la nécessité de cette requête et non de la requête elle-même.


Avez-vous besoin de lancer comme hashwithindiferencess , si vous n'associez que par chaîne? Les deux Les clauses ressemblent à elles pourraient être combinées dans où (compte_id: compte ['Compte_id'], Compte_Type: compte [Compte_type]) ou éventuellement où (compte) si vous faites confiance aux attributs. Vous pouvez également utiliser entité.select ("ID, nom"). Où () pour réduire le nombre de champs tirés si vous n'en avez pas besoin.


3 Réponses :


1
votes

Si vous utilisez des rails 5, vous pouvez essayer ou . Quelque chose comme ça xxx

Ce n'est qu'une requête SQL, mais si le tableau est grand, je ne sais pas comment cela fonctionne.


0 commentaires

2
votes

étant donné ceci: xxx pré>

Le SQL que vous voulez est: p> xxx pré>

Notez que la précédente de l'opérateur de SQL rend la même chose que:

accounts = your_array_of_hashes
entities = accounts.inject(Entity.none) { |memo, h| memo.or(Entity.where(h)) }


0 commentaires

0
votes

Si j'ai eu votre problème, cela devrait le résoudre:

entities = accounts.map { |acc| Entity.where(account_id: acc['account_id'], account_type: acc['account_type']) }

  • Tout d'abord, la méthode mappe code> renvoie une matrice toutes les entrées qui correspondent à quelque chose à quoi que ce soit à la base de données li>
  • La carte code> est interaticée via le tableau de comptes, tout comme le chacun code>, ce qui signifie qu'il apportera les données sur les comptes au où code> Query Li>
  • A virgner code> entre où code> conditions fonctionne également pour les comparaisons, sauf si vous effectuez un ou code>, dans le cas où je suppose que vous pouvez utiliser ceci Syntaxe: où ('compte_id =: id ou compte_type =: TYPE', ID: ACC ['compte_id'], Type: ACC ['Compte_Type']) Code> Li> ul> p>


0 commentaires