Rails ActiveRecord: построение запросов динамически - PullRequest
24 голосов
/ 22 мая 2011

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

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

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

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

Я стараюсь не писать какой-либо необработанный SQL.

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

Я забрел "с рельсов"?

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

Ответы [ 2 ]

56 голосов
/ 22 мая 2011

Думаю, я понял это. Я был совершенно не согласен с моим пониманием методов запросов AR. Оказывается, что ActiveRecord фактически не выполняет запрос, пока вы на самом деле не попытаетесь использовать результаты. В результате можно сделать что-то вроде:

model_query = MyModel.select("column12, column32")
model_query = model_query.joins(:user)
model_query = model_query.where(:column12 => true)

тогда после того, как все построено, вы можете сделать

model_query.each do |record|
  ...
end

На самом деле запрос не выполняется до тех пор, пока вы не вызовете каждый из них (или любой используемый вами метод, который требует результатов запроса).

Я получил это, наблюдая за Railscasts 202 и 215 . Я люблю Райана Бейтса.

0 голосов
/ 22 мая 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...