在我的 Rails 6 應用程式中,我有這些模型:
class User < ApplicationRecord
has_many :read_news_items
has_many :news_items, :through => :read_news_items
end
class NewsItem < ApplicationRecord
has_many :read_news_items
has_many :users, :through => :read_news_items
def read?(user)
read_news_items.where(:user_id => user.id).any?
end
end
class ReadNewsItem < ApplicationRecord
belongs_to :user
belongs_to :news_item
end
在我的控制器操作中,我想列出所有新聞專案并突出顯示用戶尚未閱讀的新聞專案:
class NewsItemsController < ApplicationController
def index
@news_items = NewsItem.all
end
end
問題是這會為每條記錄生成 N 1 個查詢,因為每個記錄read?(current_user)都會被呼叫user。
如何克服這個問題?
我嘗試將includes(:read_news_items)和附加joins(:read_news_items)到控制器中的資料庫查詢,但無濟于事。
uj5u.com熱心網友回復:
你可以試試:
class NewsItem < ApplicationRecord
has_many :read_news_items
def read?(user)
if read_news_items.loaded?
read_news_items.any? {|rni| rni.user_id == user.id }
else
read_news_items.where(:user_id => user.id).any?
end
end
end
class NewsItemsController < ApplicationController
def index
@news_items = NewsItem.includes(:read_news_items).all
end
end
uj5u.com熱心網友回復:
好的,我從這里給出的每個答案中學到了一些東西。所以謝謝你。
我將我的read?方法更改為以下方法,這似乎消除了 N 1 查詢:
class NewsItem < ApplicationRecord
def read?(user)
user.read_news_items.pluck(:news_item_id).include?(id)
end
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/380715.html
