#ruby-on-rails #ruby #ruby-on-rails-5
#ruby-on-rails #ruby #ruby-on-rails-5
Вопрос:
У меня есть две таблицы базы данных, user и product Когда пользователь создает продукт, user.id помещается в таблицу product в разделе product.user_id
Я пишу цикл для отображения всех продуктов, «принадлежащих» текущему подписанному пользователю, пока это выглядит так.
<% @product.each do |p| %>
<% if product.user_id = user.id %>
<tr>
<td><%= user.id %></td>
<td><%= product.user_id %></td>
<td><%= product.id %></td>
<td><%= product.name %></td>
</tr>
<% end %>
<% end %>
Например, если текущий пользователь, вошедший в систему, является пользователем 2, вместо фильтрации всех продуктов, у которых нет user.id из 2 он просто изменяет product.user_id для каждого продукта на 2, чтобы возвращаемая таблица выглядела так.
2 2 1
2 2 2
2 2 3
2 2 4
Без оператора if он возвращает полный список продуктов со всеми правильными свойствами.
Ответ №1:
Вы должны использовать ==
not =
:
<% if product.user_id == user.id %>
Комментарии:
1. Это прекрасно, спасибо! Я знал, что это будет что-то слишком простое.
Ответ №2:
Вот ваше полное решение
<% @product.each do |p| %>
<% if p.user_id == user.id %>
<tr>
<td><%= user.id %></td>
<td><%= p.user_id %></td>
<td><%= p.id %></td>
<td><%= p.name %></td>
</tr>
<% end %>
<% end %>
Однако я не знаю, что происходит в вашем контроллере, но вы, вероятно, могли бы сэкономить много усилий, отфильтровав продукты текущего пользователя в контроллере, прежде чем подавать эту @product
переменную экземпляра в представление. Может быть, попробуйте такой запрос:
user_id = current_user.id #assuming you have access to a method like this
@product = Product.where(user_id: user_id)
РЕДАКТИРОВАТЬ
филомор правильно. Вы должны добавить, что у пользователя много связей, см. Ниже.
#app/models/user.rb
class User < ActiveRecord::Base
has_many :products
end
#app/models/product.rb
class Product < ActiveRecord::Base
belongs_to :user
end
Однако не то, что у вас есть это отношение, вы хотите, чтобы при его вызове вы не вызывали запрос N 1. Чтобы избежать этого, выполните следующие действия при извлечении всех продуктов пользователя
@products = User.find(params[:user_id]).includes(:products).products
Комментарии:
1. Привет! Спасибо за это, я был уверен, что смогу сделать что-то подобное на уровне контроллера, но не был уверен, как это реализовать, это очень полезно!
2. Честно говоря, у вас, вероятно, должно быть a
has_many :products
в вашей модели пользователя и abelongs_to :user
в вашей модели продукта. Тогда вы могли бы просто написать@products = user.products
.3. Большое вам двоим спасибо, код работал с оригинальным решением от Strife, но я реорганизую его, чтобы оно было более эффективным (у меня уже были установлены эти отношения в моих моделях, но я понятия не имел, как их использовать)
Ответ №3:
Используйте оператор сравнения ==
, и ваш оператор if должен быть примерно таким
<% if p.user_id = user.id %>