Cela fait une journée entière que je me débats avec ça.
Voici ce que j'ai. A User
et un modèle de Address
modèle. User
has_many :addresses
y Adddress
belongs_to :user
.
Maintenant je veux rechercher les utilisateurs dont l'email contient un terme donné, ou l'adresse d'un des utilisateurs contient ce terme. Disons que le terme est 'jap', n'importe quel User
dont email like '%jap%'
ou tout utilisateur dont l'adresse city ou address_line est like '%jap%'
doit être retourné.
Je peux obtenir les utilisateurs avec une simple jointure comme celle-ci
users = User.joins('LEFT OUTER JOIN addresses ON users.id=addresses.user_id').where('users.email like '%jap%' OR addresses.city like '%jap%' OR addresses.address_line like '%jap%')
Cela me donne les utilisateurs souhaités. Ce que je veux, c'est qu'avec l'utilisateur renvoyé, je veux aussi les adresses qui correspondent aux critères.
Si après ce qui précède, je fais
users.first.addresses
Cela me donnera toutes les adresses de cet utilisateur. Je sais que je peux faire une autre requête sur les adresses de cet utilisateur comme ceci
users.first.addresses.where( addresses.city like '%jap%' OR addresses.address_line like '%jap%')
Mais ce n'est pas comme ça que ça devrait fonctionner. J'ai essayé de comprendre et de chercher sur Google mais je n'ai pas encore trouvé de solution. Quelqu'un a-t-il déjà rencontré ce problème ?
Edit#1 Il existe de nombreuses solutions similaires avec deux requêtes. Ce que je recherche, c'est une solution à requête unique, car il me semble absurde d'appliquer deux fois les mêmes conditions sur des adresses.