Rails3 и Arel для выбора с помощью IN и подвыборки

У меня есть таблица с переводами. (И соответствующий класс ActiveRecord). Эта таблица содержит следующие поля: идентификатор, ключ и значение.

Я хотел бы выбрать все переводы, где ключ соответствует заданному запросу + все переводы, которые не соответствуют запросу, но разделяют ключ с переводом, который соответствует запросу.

Результирующий SQL может выглядеть примерно так:

SELECT * FROM TRANSLATIONS where key in
    (select key from Translations where value like '%some search%')

Я пробовал несколько вещей, но я не могу понять это. Любые идеи о том, как выразить это в Arel?


person Mark Meeud    schedule 12.08.2010    source источник


Ответы (2)


Что-то вроде этого должно работать:

t = Table(:translations)
c = t.where(t[:value].matches('%some search%')).project(:key)
t.where(t[:key].in(c))
person valodzka    schedule 17.08.2010
comment
Привет Спасибо за ответ. Этот фрагмент кода генерирует оператор sql, который выглядит так, как будто он должен это делать, однако mysql жалуется на ошибку в синтаксисе. Он отображает это: SELECT translations.* FROM translations WHERE (translations.key IN (SELECT key FROM translations WHERE translations.value LIKE '%value1%')) В то время как он должен отображать: SELECT translations.* FROM translations WHERE (translations.key IN (ВЫБЕРИТЕ translations.key ИЗ translations ГДЕ translations.value НРАВИТСЯ '%value1%')) Есть ли способ это контролировать? - person Mark Meeud; 18.08.2010
comment
Использовать проект(:'translations.key') - person valodzka; 19.08.2010

Аналогичен @valodzka, но добавляет "t[....]" вокруг символа :key.

t = Table(:translations)
c = t.where(t[:value].matches('%some search%')).project(t[:key])
t.where(t[:key].in(c))
person nessur    schedule 18.03.2011