Ruby on rails Rails-通过关联,急切地加载

Ruby on rails Rails-通过关联,急切地加载,ruby-on-rails,rails-activerecord,Ruby On Rails,Rails Activerecord,我有一个非常简单的例子,通过联想如下: class Retailer < ActiveRecord::Base has_many :retailer_tags has_many :tags, through: :retailer_tags end class Tag < ActiveRecord::Base has_many :retailer_tags has_many :retailers, through: :retailer_tags end class

我有一个非常简单的例子,通过联想如下:

class Retailer < ActiveRecord::Base
  has_many :retailer_tags
  has_many :tags, through: :retailer_tags
end

class Tag < ActiveRecord::Base
  has_many :retailer_tags
  has_many :retailers, through: :retailer_tags
end

class RetailerTag < ActiveRecord::Base
  belongs_to :retailer
  belongs_to :tag
end
class零售商
在我的零售商控制器的索引中,我想显示所有零售商及其相关标签的列表。如果我的控制器
@retailers=Retailer.all
,然后在我的视图中遍历所有零售商,那么我有一个N+1查询问题

我可以直接使用Postgresql解决这个问题,它工作得很好,但我想了解如何在Rails中实现它

当我执行
@retailers=Retailer.eager\u load(Retailer\u tags::tag)。all
(或任何includes/preload/join)时,仍然会收到N+1个查询

我做错了什么?
感谢您的帮助

执行
@retailers=Retailer.eager_load(:tags)。所有
或您可以执行以下操作:

@retailers=Retailer.includes(:tag)。全部


使用includes允许rails根据情况进行最有效的查询。除非左外连接返回一个错误,Rails将在两个查询中执行此操作,如
preload

do
@retailers=Retailer.eager\u load(:tags)。所有
或您可以执行以下操作:

@retailers = Retailer.includes(:tag)
@retailers=Retailer.includes(:tag)。全部


使用includes允许rails根据情况进行最有效的查询。除非左外联接返回一个错误,此时Rails将在两个查询中执行此操作,如
preload

Rails中有三种方法,通过使用它们,您可以立即加载关联

@retailers = Retailer.includes(:tag)
  • 包括
  • 预载
  • 急负荷
你的例子

retaillers = Retailer.includes(:tag).all
retaillers = Retailer.preload(:tag).all
retaillers = Retailer.eager_load(:tag).all

有关更多详细信息,请参见

rails中有三种方法,通过使用它们,您可以加载关联

  • 包括
  • 预载
  • 急负荷
你的例子

retaillers = Retailer.includes(:tag).all
retaillers = Retailer.preload(:tag).all
retaillers = Retailer.eager_load(:tag).all

有关更多详细信息,请参见

工作完美,谢谢,除了我必须做的:@retailers=Retailer.eager\u load(:tags)。所有工作完美,谢谢,除了我必须做的:@retailers=Retailer.eager\u load(:tags)。所有