#ruby-on-rails-3
#ruby-on-rails-3
Вопрос:
Rails 3 здесь новичок. В настоящее время приведенный ниже код в моем контроллере получает всю запись в моей базе данных. Я пытаюсь заполнить массив одним целым числом, а не всей записью. Целое число содержится в таблице «ответы», а имя поля — «оценка». Как я могу изменить эту строку в моем контроллере, чтобы получить только одно поле?
@questions.each do |s|
@ans[s.position] = Answer.where("question_id = ? AND user_id = ?", s.q_id, current_user.id )
end
ОБНОВЛЕНИЕ Для ПОЯСНЕНИЯ: Значение :score может быть любым целым числом от 0 до 5. Я хотел бы заполнить @ans[s.position] целым числом.
Спасибо.
Ответ №1:
Вы очень близки
@questions.each do |s|
@ans[s.position] = Answer.where("question_id = ? and user_id = ?",s.q_id,current_user.id).select(:score).first.try(:score)
end
Вам нужно выбрать «оценка» из ответа, затем вам нужно извлечь его из объекта.
Комментарии:
1. отлично. Спасибо. мне интересно, почему часть «.select (: score)». все работает без этого. я что-то упускаю?
2. Это гарантирует, что базовый запрос select не выполняет «выбрать * из таблицы ..», а только «выбрать оценку из таблицы ..». Зачем выбирать все поля, когда вы знаете, что вам нужно только одно (оценка).
Ответ №2:
Поскольку where
потенциально может возвращать много Answer
записей, используйте first
для извлечения первой Answer
, а затем score
для проецирования поля оценки.
answers = Answer.where("question_id = ? AND user_id = ?", s.q_id, current_user.id )
score = answers.first.score
Все вместе это было бы:
@questions.each do |s|
@ans[s.position] = Answer.where("question_id = ? AND user_id = ?", s.q_id, current_user.id ).first.score
end
В качестве оптимизации для извлечения только score
из базы данных, вместо answers.*
, вы могли бы использовать select(:score)
.
@questions.each do |s|
@ans[s.position] = Answer.where("question_id = ? AND user_id = ?", s.q_id, current_user.id ).select(:score).first.score
end
Подробнее об использовании смотрите в Интерфейсе запроса активной записи select
.
Комментарии:
1. на вопрос каждого пользователя будет только один ответ. Если их больше одного, то каким-то образом система будет нарушена. Мне интересно, должен ли я оставить «.first» вне. Если бы произошла ошибка, то это показало бы, что где-то была проблема.
2. ах … не обращайте внимания на комментарий. я удалил его, и приложение выдало ошибку. Итак, теперь я вижу актуальность. Спасибо.
3. Обновленный ответ с объяснением
select
и ссылкой на руководства Ruby on Rails для получения дополнительной помощи.
Ответ №3:
Только include
них.
@questions = Question.includes(:answers).select(:position)
Или используйте это
@questions = Question.select(:position)
@questions.each{ |s| @ans[s.position] = s.answers.where(:user_id => current_user.id) }
Комментарии:
1. я попробовал ваши решения и их варианты. В каждом случае приложение выдавало ошибки. Я не в состоянии понять ваши решения настолько, чтобы внести коррективы, которые сработали бы. Тем не менее, спасибо.