Я прочитал эту интересную статью о Использование полиморфизма для создания более эффективного фида активности в рельсах.
В итоге получилось что-то вроде
class Activity < ActiveRecord::Base
belongs_to :subject, polymorphic: true
end
Теперь, если два из этих предметов, например:
class Event < ActiveRecord::Base
has_many :guests
after_create :create_activities
has_one :activity, as: :subject, dependent: :destroy
end
class Image < ActiveRecord::Base
has_many :tags
after_create :create_activities
has_one :activity, as: :subject, dependent: :destroy
end
С create_activities, определяемым как
def create_activities
Activity.create(subject: self)
end
И с гостями и тегами, определенными как:
class Guest < ActiveRecord::Base
belongs_to :event
end
class Tag < ActiveRecord::Base
belongs_to :image
end
Если мы запустим последние 20 действий, мы можем сделать:
Activity.order(created_at: :desc).limit(20)
У нас есть первая проблема с запросом N + 1, которую мы можем решить с помощью:
Activity.includes(:subject).order(created_at: :desc).limit(20)
Но тогда, когда мы вызываем гостей или теги, у нас возникает другая проблема с запросом N + 1.
Какой правильный способ решить эту проблему, чтобы иметь возможность использовать разбивку на страницы?