Я пытаюсь внедрить "симпатичную" систему в моем приложении. Я отображаю таблицу с заказами, тогда текущий пользователь может «понравиться» заказу, поэтому он получит уведомления, когда статус заказа изменится. Проблема в том, что у меня проблема N + 1, так как каждый раз, когда таблица обрабатывается, программа делает столько запросов, сколько отображается заказов, чтобы определить, понравился ли заказ пользователю.
Я читал, что этого можно избежать, используя «include» для загрузки соответствующих записей, но я не могу понять, как это сделать, особенно в моем случае.
У меня есть следующие модели и ассоциации:
user.rb
Включил ли я лайки? метод, который вызывает предупреждение N + 1:
class User < ApplicationRecord
devise :database_authenticatable, :recoverable, :rememberable, :trackable,
:validatable
has_many :likes
def likes?(order)
order.likes.where(user_id: id).any?
end
end
like.rb
class Like < ApplicationRecord
belongs_to :user
belongs_to :order
end
order.rb
class Order < ApplicationRecord
has_many :likes
.
.
.
Для каждой строки таблицы я отображаю эту частичку, чтобы показать, нравится ли заказ или нет:
<% if current_user.likes?(order) %>
<%= link_to "<i class='fa fa-fire fa-2x fa-like'></i>".html_safe,
order_like_path(order), method: :delete, remote: true %>
<%else%>
<%= link_to "<i class='fa fa-fire fa-2x fa-unlike'></i>".html_safe,
order_like_path(order), method: :post, remote: true %>
<%end%>
Это запрос:
Rendered orders/_likes.html.erb (135.5ms)
Like Exists (0.5ms) SELECT 1 AS one FROM "likes" WHERE "likes"."order_id"
=$1 AND "likes"."user_id" = $2 LIMIT $3 [["order_id", 7875], ["user_id",
1], ["LIMIT", 1]]
EDIT. Я добавляю действие index, если оно полезно:
def index
orders = request.query_string.present? ? Order.search(params,
current_user) : Order.pendientes
if params[:button] == 'report'
build_report(orders)
else
@orders = orders.order("#{sort_column} #
{sort_direction}").page(params[:page]).per(params[:paginas])
end
end