0
votes

Rails 5 de gauche_outer_join avec une carte d'identité enregistrée spécifique

J'ai un système avec les modèles suivants

Offer.left_outer_joins(:applications).where(id: { 'application.accetped_offer_id' })


1 commentaires

Essayez .where ("application.accetped_offer_id n'est pas null")


3 Réponses :


2
votes

quelque chose comme ça? XXX


2 commentaires

Je ne sais pas ce que le schéma est ici, mais cela ne fonctionnera que si offre.aplication_id = application.id et offre.id = applications.accepted_offer_id en raison de la jointure. Si ces 2 sont des préoccupations distinctes, cette requête échouera par ex. Si une application.Accepted_offer_id peut être destinée à une offre associée à une application différente


Oui, je sais, mais cela devrait travailler pour comment j'ai voulu le schéma



1
votes

Pour réécrire le premier bit un peu plus agréable: xxx pré>

se déplacer sur la réécriture de la réécriture du SQL, je suis à peu près sûr de ce que vous devez faire est: P>

Offer.joins(:application).where('offers.id = applications.accepted_offer_id')


0 commentaires

0
votes

Vous pouvez également choisir d'utiliser une sous-requête.

SELECT `offers`.*
FROM `offers`
WHERE `offers`.`id` IN (
  SELECT `applications`.`accepted_offer_id`
  FROM `applications`
)


1 commentaires

N'oubliez pas que la méthode #inspect déclenche déjà la requête (avec une limite de 11). Ce n'est qu'un problème si vous le copiez dans la console de rails. Pour éviter ce suffixe, les lignes avec ; nil . De cette façon, le résultat n'est pas retourné à la console, qui appellerait à son tour la méthode #inspect . Sinon, vous pouvez envelopper cela dans un commencer / extrémiser bloc.