У меня есть следующее приложение, которое загружает информацию с веб-сайтов.
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 исчезает, но я теряю информацию URL, отображаемую в моем фиде. какие-либо предложения, почему это происходит?