我正在使用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
处理此问题的正确方法是什么?怎么样?
答案 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