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)。所有