我有以下Rails应用,可获取网站信息。
class Website < ApplicationRecord
has_many :details
has_many :urls, through: :details
end
class Detail < ApplicationRecord
belongs_to :website
belongs_to :url
end
class Url < ApplicationRecord
has_many :details
has_many :websites, through: :details
end
websites = Websites.joins(:urls, :details).includes(:urls, :details).paginate(page: params[:page], per_page: 10)
这是通过关联的典型has_many。但是,当我尝试在活动模型序列化中合并JSON输出时,出现N + 1问题。
class WebsiteSerializer < ActiveModel::Serializer
attributes :results
def results
{websiteinfo: website_info_with_details}
end
def website_info_with_details
object.detail.map do |k|
k.attributes.merge(k.url.attributes)
end
end
为什么它会导致N + 1,尽管如上所示,我同时包含了以上两个表?当我删除行k.attributes.merge(k.url.attributes)
时,N + 1问题消失了,但是我丢失了Feed中显示的网址信息。有什么建议为什么会发生这种情况?