Я пытаюсь собрать серию классов, которые могут использовать ActiveRecord для динамического создания и выполнения сложных запросов. Я чувствую себя очень комфортно со всей практикой:
MyModel.select("id, name, floober").join(:creator).where(:is_active => true)
Я борюсь с тем, чтобы использовать эти вещи для построения запроса без возможности определить, сколько будет каждого возможного метода (количество соединений, число или пункты where, limit, group и т. д.) заблаговременно. У меня может быть 2 соединения или нет соединений в зависимости от того, откуда оно вызывается.
Из-за характера того, как я получаю эти вещи - список объединений, список столбцов, список предложений where и т. Д. - Я могу слепо сковать их вместе. Мне нужно соединить столбцы вместе, упорядочить соединения, связать предложения where, поэтому я не могу перебирать различные списки.
Я стараюсь избегать написания необработанного SQL.
Я пробовал одну вещь: построил оператор ruby в виде строки, а затем отменил его в конце, и когда я закончил, я почувствовал себя грязным, как будто мне нужно было принять ванну. Я ищу способ кэшировать состояние моего запроса до тех пор, пока все части не будут собраны, а затем выполнить их.
Не ушел ли я «с рельсов»?
заранее спасибо ...
В этом случае send
может быть вашим другом. Это все еще довольно произвольное выполнение кода, но по крайней мере вы не используете eval
. Не совсем ясно, есть ли у вас эти части запроса одновременно или вы создаете их с течением времени. Если они присутствуют в одном цикле http запрос / ответ, то имеет смысл перебирать части запроса и делать send
, в зависимости от ситуации.
OTOH, если вы получаете его через Ajax или каким-либо другим способом, где условия являются кумулятивными, вам, возможно, придется взглянуть либо на кеширование существующих частей, либо на какое-то более экзотическое решение.