Запрос к базе данных, чтобы найти элемент, на который ранее пользователь не ответил - PullRequest
0 голосов
/ 25 февраля 2012

Я новичок в RoR и не занимался веб-программированием около 10 лет, поэтому, пожалуйста, будьте добры ...

У меня есть две таблицы, вопросы и ответы.ответы принадлежат к вопросам, а вопросы имеют много ответов.Я пытаюсь сделать запрос, который найдет случайный вопрос, чье «открытие» является истинным, и чьи ответы НЕ включают ни одного пользователя с определенным идентификатором.Вот где все обстоит сейчас:

offset = rand(Question.joins(:responses).where('responses.user_id <> ? and open = ?',     current_user.id, "true").count)
@question = Question.joins(:responses).where('responses.user_id <> ? and open = "true"', current_user.id, "true" ).at(offset)

В моей базе данных есть вопрос, статус которого открыт и на который пользователь с ID = 1 не ответил, но эти запросы ничего не возвращают.Заранее спасибо за помощь!

Ответы [ 3 ]

1 голос
/ 25 февраля 2012

Разбейте его и проверьте детали:

What does rand(Question) return ?  
What does rand(Question.joins(:responses) return ?
What does Question.joins(:responses).where(...) return ?
What does Question.where 'responses.user_id <> ? and open = true', current_user.id) return

и т. Д.

Сделайте это в консоли рельсов.Если current_user недоступен, найдите нужного пользователя и установите current_user равным id или просто используйте номер id, например, '23'

0 голосов
/ 25 февраля 2012
Question.joins(:responses).where('user_id <> ? and open = ?', current_user, true).order('RANDOM()').first
0 голосов
/ 25 февраля 2012

У меня нет модели, похожей на вашу, так что это своего рода выстрел в темноте, buuut ...

Вы не хотите передавать строку "true" в ваш запроспотому что open никогда не будет равняться строке "true".Это логическое значение, а не строка.Предположительно.

Так что попробуйте что-то вроде этого:

offset = rand(Question.joins(:responses).where('responses.user_id <> ? and open = ?',     current_user.id, true).count)
@question = Question.joins(:responses).where('responses.user_id <> ? and open = ?', current_user.id, true).at(offset)

Нет обещаний, но это только начало.

Я действительно думал о гораздо более простом способе сделать это, чем оиспользуя два отдельных запроса!

Попробуйте это:

Question.joins(:responses).where('responses.user_id <> ? and open = ?', current_user.id, true).order('RAND()').first

Это не будет работать в таких вещах, как SQLite, у которых нет оператора RAND(), но в противном случае вы получитеодна случайная запись, которая соответствует остальным критериям.

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