Я создал следующий запрос, который будет работать для любой модели и связанного массива запросов.
def chain_queries_on(klass, arr)
arr.inject(klass) do |relation, query|
begin
relation.send(query[0], *query[1..-1])
rescue
break;
end
end
end
Я проверил в местном масштабе для следующего теста,
arr = [['where', {id: [1,2]}], ['where', {first_name: 'Shobiz'}]]
chain_queries_on(Article, arr)
Запрос запущен, как показано ниже, чтобы вернуть правильный вывод,
Article Load (0.9ms) SELECT `article`.* FROM `article` WHERE `article`.`id` IN (1, 2) AND `article`.`first_name` = 'Shobiz' ORDER BY created_at desc
Примечание-1: несколько заметных случаев
для пустых arr
, он вернет class
, который мы передали в качестве первого аргумента в методе.
Возвращает nil
в случае ошибки. Ошибка может произойти, если мы используем pluck
, который будет возвращать массив (вывод, который не является цепочечным) или если мы не передадим класс в качестве первого параметра и т. Д.
Можно внести дополнительные изменения для улучшения вышеуказанного и избежать крайних случаев.
Примечание-2: улучшения
Вы можете определить этот метод как метод класса для Object
класса также с одним аргументом (т. Е. Массивом) и вызывать непосредственно для класса, как,
# renamed to make concise
Article.chain_queries(arr)
User.chain_queries(arr)
Внутри метода, используйте self
вместо klass