Rails ActiveRecord: динамическое построение запросов

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

MyModel.select("id, name, floober").join(:creator).where(:is_active => true)

Я борюсь с тем, чтобы использовать эти вещи для построения запроса без возможности определить, сколько будет каждого возможного метода (количество соединений, число или пункты where, limit, group и т. д.) заблаговременно. У меня может быть 2 соединения или нет соединений в зависимости от того, откуда оно вызывается.

Из-за характера того, как я получаю эти вещи - список объединений, список столбцов, список предложений where и т. Д. - Я могу слепо сковать их вместе. Мне нужно соединить столбцы вместе, упорядочить соединения, связать предложения where, поэтому я не могу перебирать различные списки.

Я стараюсь избегать написания необработанного SQL.

Я пробовал одну вещь: построил оператор ruby ​​в виде строки, а затем отменил его в конце, и когда я закончил, я почувствовал себя грязным, как будто мне нужно было принять ванну. Я ищу способ кэшировать состояние моего запроса до тех пор, пока все части не будут собраны, а затем выполнить их.

Не ушел ли я «с рельсов»?

заранее спасибо ...

24
задан jaydel 21 May 2011 в 22:07
поделиться

1 ответ

В этом случае send может быть вашим другом. Это все еще довольно произвольное выполнение кода, но по крайней мере вы не используете eval. Не совсем ясно, есть ли у вас эти части запроса одновременно или вы создаете их с течением времени. Если они присутствуют в одном цикле http запрос / ответ, то имеет смысл перебирать части запроса и делать send, в зависимости от ситуации.

OTOH, если вы получаете его через Ajax или каким-либо другим способом, где условия являются кумулятивными, вам, возможно, придется взглянуть либо на кеширование существующих частей, либо на какое-то более экзотическое решение.

0
ответ дан 28 November 2019 в 22:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: