#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
.* FROMusers
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. Спасибо. Я использую ваше решение. Ошибка, которую я получаю, теперь является частью моего поста.