rails включает в себя has_many через перекрестные ссылки в модели - PullRequest
0 голосов
/ 01 ноября 2018
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?

...