Новичок в Rails 3 — сложность заполнения массива

#ruby-on-rails-3

#ruby-on-rails-3

Вопрос:

ОБНОВЛЕНИЕ РЕШЕНИЕМ, ПРИВЕДЕННЫМ НИЖЕ, ПРИВОДИТ К НОВОЙ ОШИБКЕ.

Пользователи приглашают других ознакомиться с их работой. Для отслеживания этого в таблице приглашений есть поля reviewer_id и reviewee_id. Модель содержит:

 belongs_to :user
has_many :users
  

Чтобы отобразить все приглашения для пользователя, мы сначала получаем все приглашения:

 @invitations = Invitation.where("reviewee_id = ?", current_user.id ).select(:reviewer_id).order("updated_at")
  

Затем мы получаем всех приглашенных пользователей: (эта часть неверна)

 @reviewers = []
@invitations.each do |i|
  @reviewers << User.where("id = ?", i.reviewer_id )
end
  

Это текущее решение приводит к следующему:

 undefined method `first_name' for []:ActiveRecord::Relation
  

Я провел тест со следующим кодом, чтобы посмотреть, что есть в @reviewers:

 <% @reviewers.each do |r| %>
   <%= r.id %><br>
<% end %>
  

Вместо возврата идентификаторов, которые он вернул:

 2173491700
2173491200
2173490540
  

Таким образом, массив не заполняется должным образом.

Я благодарен за вашу помощь и особенно за конкретный код.

Ответ №1:

Вы хотите собрать все идентификаторы, а затем передать их where .

 reviewer_ids = @invitations.collect { |i| i.reviewer_id }
@reviewers = User.where(:id => reviewer_ids)
  

Это захватывает всех проверяющих в одном вызове базы данных.

Комментарии:

1. Спасибо! Я получаю следующую ошибку: «Mysql2:: Error: Операнд должен содержать 1 столбец (ы): SELECT users .* FROM users WHERE (id = 23,24,25)»

2. @Jay — Ты должен сделать: @reviewers = User.where(:id => reviewer_ids)

3. Нет проблем. Определенно придерживайтесь того, что сказал @mischa в ответ на where утверждение.

Ответ №2:

Сделайте следующее, чтобы получить рецензентов:

 @reviewers = []
@invitations.each do |i|
  @reviewers << User.where("id = ?", i.reviewer_id )
end
  

<< Добавляет элементы в массив. И перед итерацией мы создаем массив.

Комментарии:

1. Спасибо. Я использую ваше решение. Ошибка, которую я получаю, теперь является частью моего поста.