class Foo
# attribute amount
has_many :foobars
has_many :bars, through: :foobars
end
class Bar
has_one :foobars
has_one :foo, through: :foobar
# this method gets automatically included in the bar object as attribute
def amount
self.foo.amount
end
end
class FooBar
belongs_to :foo
belongs_to :bar
end
class FoosController
def show
foo = base_class.find(some_id)
respond_with foo.as_json(include: :bar)
end
def base_class
Foo.includes(:foobars, :bars)
end
end
Важной частью является контроллер # base_class, в который я включаю отношения для уменьшения нагрузки на БД, поскольку :bar
включается в ответ :foo
. Но я получаю что-то вроде n + 1, потому что :bar
также загружает foo.amount
Bullet gem предлагает добавить :foo
к Foo.includes(:foobars, :bars)
Но foo не имеет отношения foo и, очевидно, потерпит неудачу.
Как включить / preload / join, чтобы решить n + 1?