1

Извините за нечеткое название, однако, я надеюсь, что тело четко описывает мою проблему.Два массива для оценки элемента по элементу в запросе

Поэтому у меня есть два массива

title_id: [1542, 1507, 47, 1436, 1527, 3, 173, 1534, 1876, 398] 
ref_no: [10, 10, 74, 12, 9, 35, 10, 9, 1, 42] 

Я хотел бы запросить, что индекс первого массива должен быть и с индексом второго массива. Вроде бы: title_id = 1542, я хочу И это только с ref_no = 10. и так далее.

Я попробовал следующий запрос, но это, как умножение indecies:

Book.where("title_id IN (?) AND ref_no IN (?) ", @ids.map(&:title_id), @ids.map(&:ref_no)) 

с помощью: RoR 3, PGSQL

+0

Вы хотите '(title_id = 1542 и ref_no = 10) или (title_id = 1507 и ref_no = 10) или (title_id = 47 и ref_no = 74) или ...'? –

+0

Да, это то, что я хочу – PeaceDefener

ответ

1

Такого рода вещи довольно легко в аромате PostgreSQL о SQL. Вы можете присоединиться к выражению VALUES как это:

select books.* 
from books b 
join (values (1542, 10), (1507, 10), ...) as dt(t, r) 
    on b.title_id = dt.t and b.ref_no = dt.r 

Или вы можете использовать ЛЮБУЮ и массив или IN:

where (title_id, ref_no) = any (array[(1542,10), (1507, 10), ...]) 

where (title_id, ref_no) in ((1542,10), (1507, 10), ...) 

Или обычный большой беспорядок из ОШ:

where (title_id = 1542 and ref_no = 10) 
    or (title_id = 1507 and ref_no = 10) 
    or ... 

Второй вариант (вариант IN):

where (title_id, ref_no) in ((1542,10), (1507, 10), ...) 

- это самое яркое совпадение с вашими намерениями ИМО. Я не могу придумать какой-либо приятный способ заставить AR построить это, но поскольку мы имеем дело с целыми числами и не должны беспокоиться о проблемах с котировками и экранированием, мы можем сделать это с небольшим перебором строк:

trs = @ids.map { |o| "(#{o.title_id.to_i}, #{o.ref_no.to_i})" }.join(',') 
Book.where("(title_id, ref_no) in (#{trs})") 

Вы могли бы построить ИЛИ версию с некоторой длинной цепью непонятных звонков AREL, но я, как правило, отказаться от AR и идти прямо к SQL, когда все становится более сложным, чем ребенок-ток a = b and c = d SQL, что AR хочет говорить ,

+0

работал, спасибо большое – PeaceDefener

Смежные вопросы