оператор if в свойствах редактирования цикла ruby

#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 в вашей модели пользователя и a belongs_to :user в вашей модели продукта. Тогда вы могли бы просто написать @products = user.products .

3. Большое вам двоим спасибо, код работал с оригинальным решением от Strife, но я реорганизую его, чтобы оно было более эффективным (у меня уже были установлены эти отношения в моих моделях, но я понятия не имел, как их использовать)

Ответ №3:

Используйте оператор сравнения == , и ваш оператор if должен быть примерно таким

 <% if p.user_id = user.id %>