为'has_many'关联加载关联对象的正确方法是什么?

时间:2014-03-04 16:07:07

标签: ruby-on-rails ruby ruby-on-rails-4 associations eager-loading

我正在使用Ruby on Rails 4,我希望为has_many关联加载关联对象。也就是说,我有以下模型:

class Article < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :article
end

由于我在加载comments时经常检索articles,因此每次搜索comments时都希望加载articles,例如在这些情况下:

# In these cases the eager loading should happen.
Article.find(1)
Article.where(:title => 'Sample text')
@current_user.articles

处理此问题的正确方法是什么?怎么样?

2 个答案:

答案 0 :(得分:3)

您应该使用includes方法,如下所示:

Article.includes(:comments).where(title: 'Sample text')

对于您的第一种情况,您并不需要急切加载,因为您只选择一条记录,因此这不是n + 1问题。你可以这样做:

article = Article.find(1)
article.comments

如果您经常使用包含文章,则可以定义范围:

scope :with_comments, -> { includes(:comments }

并简单地称之为:

Article.with_comments.where(title: 'Sample text')

当你想要包含comments的关系来自另一个关联时,没有任何变化,你可以同时做到这两点:

@current_user.articles.includes(:comments)

@current_user.articles.with_comments

答案 1 :(得分:0)

如果您希望在加载文章时自动加载comments,则可以在文章模型上使用default_scope

class Article < ActiveRecord::Base
  has_many :comments
  default_scope :include => :comments
end