извлечение одного поля записи в массив в приложении Rails 3

#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. я попробовал ваши решения и их варианты. В каждом случае приложение выдавало ошибки. Я не в состоянии понять ваши решения настолько, чтобы внести коррективы, которые сработали бы. Тем не менее, спасибо.