2013-08-01 1 views
2

Я нахожусь в необходимости выполнить запрос, как это в рельсах:Rails ИЛИ запрос с JOIN и LIKE

select users.* from users inner join posts on users.id = posts.user_id where posts.title like '%xxx%' or posts.title like '%yyy%' or posts.title like '%zzz%' 

Где пользователя и послевузовском мои модели. Я сделал что-то вроде этого:

title_array = ["xxx", "yyy", "zzz"] 
users = User.all 
users = users.joins(:posts).where(posts: { title: title_array }) 

, но это дает мне SQL запрос так:

select users.* from users inner join posts on users.id = posts.user_id where posts.title IN ('%xxx%', '%yyy%', '%zzz%') 

Также у меня есть значение posts.title в массиве. Поэтому я привел пример с тремя значениями OR, но он может меняться в зависимости от каждого запроса.

Мне нужен рельс, чтобы решить эту проблему. Может ли кто-нибудь помочь мне разобраться в этом, пожалуйста?

ответ

4

У попробовать с

users.joins(:posts).where(title_array.map{|title| "posts.title like '%#{title}%'"}.join(' or ')) 
+1

работал как шарм !! Спасибо за этот ответ чувак. – Lalu

+0

@Lalu, Welocme :) –

1

Попробуйте

title_array = ["xxx", "yyy", "zzz"] 
users = User.all 
condition = "1" 
title_array.each {|t| condition = condition + " OR posts.title LIKE '%#{t}%'"} 
users = users.joins(:posts).where(condition) 
+1

Это также сработало, за исключением небольшого изменения добавления отдельной кавычки: «% # {t}% '. Я использую базу данных mysql. Спасибо за ответ чувак. – Lalu