2016-06-13 2 views
0

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

Response.joins(choice: { question: :survey }) 
    .where(surveys: { id:survey.id }) 
    .limit(plan.response_limit) 
    .where(choice: object) 

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

Edit:

Запрос я отправил производит следующий SQL:

SELECT "responses".* FROM "responses" 
INNER JOIN "choices" ON "choices"."id" = "responses"."choice_id" 
INNER JOIN "questions" ON "questions"."id" = "choices"."question_id" 
INNER JOIN "surveys" ON "surveys"."id" = "questions"."survey_id" 
WHERE "surveys"."id" = 1 AND "responses"."choice_id" = 1 
LIMIT 5000 

Edit 2: SQL форматирования

+0

Что такое SQL, который производит и какой SQL вы ожидаете? – Anthony

+0

Редактировать: я добавил SQL к самому сообщению. Я не знаю, как должен выглядеть SQL-запрос, но я знаю, что хочу: я хочу найти ответы для данного опроса, ограничить результаты, скажем, 5000, а затем найти количество ответов для данного идентификатора выбора в рамках этих ограниченных результатов. –

+0

Как обычно выглядит SQL-запрос. Предложение LIMIT всегда указывается в конце запроса. Это не значит, что он идет и выталкивает их всех, а затем предел ... это то, как он написан в соответствии со стандартом. –

ответ

0

Вы можете использовать метод from выбрать из подзапроса:

subquery = Response.joins(choice: { question: :survey }) 
    .where(surveys: { id:survey.id }) 
    .limit(plan.response_limit) 

responses = Response.from(subquery, :resp) 
    .where(choice: object) 

Я не уверен на 100%, как Rails имеет дело с подзапросами позади сцены, поэтому вам, возможно, придется настроить это на что-то вроде этого:

responses = Response.from(subquery) 
    .where("resp.choice_id = ?", object) 
+0

Я пробовал оба запроса, и оба возвращали ту же ошибку: 'PG :: UndefinedTable: ERROR: отсутствует запись FROM-clause для ответов« 0 » LINE 1: SELECT« ответы ». * FROM (SELECT« ответы ». * FROM "respo ...' Редактировать: обрезать сообщение об ошибке –

+0

Я отредактировал свой ответ, чтобы использовать псевдоним таблицы ('resp'), который, как я думаю, исправит ошибку. Я никогда не использовал эту функцию , однако, поэтому может потребоваться больше изящества. –

+0

Я попытался использовать псевдоним таблицы, но я получаю ту же ошибку. Мне нужно будет прочитать метод «from» и подзапросы - это незнакомая территория. –

Смежные вопросы