Генерация сложного одиночного SQL-запроса с помощью Rails Arel из чанков

Я действительно был удивлен, используя Arel для создания одного составного SQL-запроса, когда обнаружил, что вещи Arel не могут быть связаны.

После долгих поисков я нашел единственное решение. Он использует пользовательский метод «отражать», и идея состоит в том, чтобы рекурсивно создавать экземпляры новых классов строителя. Неважно.

Например, как меня пытались:

e = Arel::Table.new(:events)
a = e.where(e[:id].eq(1))

if (smth)  { a.where(e[:name].eq('joe')) } # not works

Невозможно связать это как-то вместе. Мои планы рассыпались вдребезги.. Ладно, уже реализую вручную.

Однако это не очень хорошая идея, потому что я должен предотвратить любые ловушки sql-инъекций и т. Д.


person Vitalyp    schedule 13.05.2020    source источник


Ответы (1)


e.where(e[:id].eq(1).and(e[:name].eq('joe'))

Я действительно не понимаю, почему вы хотите использовать Arel, поскольку это тривиальная задача с интерфейсом запросов ActiveRecord:

Event.where(id: 1, name: 'joe')
# calls to merge are additive 
Event.where(id: 1).where(name: 'joe')
# you can also programmatically merge scopes together
Event.where(id: 1).merge(Event.where(name: 'joe')) 
person max    schedule 13.05.2020
comment
поскольку у меня нет моделей, я использую удаленное соединение MySQL для получения некоторых данных, это сторонний сервер базы данных. Согласен, что возможно Arel и не ключ для такой задачи.. Но альтернативы не нашел. Это должно быть безопасно, предотвращать любые SQL-инъекции и т. д. - person Vitalyp; 13.05.2020
comment
Я вижу ваш пример с выражением цепочки arel, но моя цепочка связана с другими условиями, например: e[:name] не следует добавлять, если мои параметры запроса не содержат такой атрибут фильтра - person Vitalyp; 13.05.2020
comment
Вместо этого я бы просто создал модели - вы не сэкономите себе никакой работы и, скорее всего, создадите беспорядок, если попытаетесь сделать MVC без M. И да, вы все равно можете использовать ActiveRecord, если у вас есть существующая устаревшая БД. - person max; 13.05.2020
comment
Нет, в основном мне не нужен MVC с этим. Я полагаю, что решить эту задачу с помощью sql-производства с использованием конкатенаций самых старых добрых строк будет гораздо быстрее.. :/ - person Vitalyp; 13.05.2020
comment
Это плохой вывод, но, думаю, что угодно. - person max; 13.05.2020
comment
Плохой вывод остается нерешенным, без каких-либо решений. Я думаю, это долгосрочное обсуждение, и мне нужен какой-либо временный обходной путь. - person Vitalyp; 13.05.2020