3

我正在使用 Ruby on Rails 3.2.2,并且has_many :through为了“按类别订购文章”,我具有以下关联:

class Article < ActiveRecord::Base
  has_many :category_associations                                     # Association objects
  has_many :associated_categories, :through => :category_associations # Associated objects
end

class CategoryAssociation < ActiveRecord::Base
  acts_as_list :scope => 'category_id = #{category_id} AND creator_user_id = #{creator_user_id}'

  belongs_to :associated_article
  belongs_to :creator_user, :foreign_key => 'creator_user_id'
end

在检索associated_categories时,我想加载category_associations用户创建的对象(注意:创建者用户由数据库表creator_user_id中存在的列标识) ,因为我需要显示值(注意:属性 an是gem 和它所必需的是数据库表中的一列)“靠近”每篇文章的标题。category_associationspositionpositionIntegeract_as_listcategory_associations

实际上,在我看来,我想以一种适当高效的方式制作类似以下内容(注意:假设每篇文章@articles都由用户“类别相关” - 用户指的是提到的创建者用户category_associations):

<% @articles.each do |article| %>
  <%= link_to(article.title, article_path(article)) %> (<%= # Display the article position in the given category %>)
<% end %>

可能,我应该“创建”和“处理”一个自定义数据结构(或者,也许,我应该做一些其他的......),但我不知道如何继续完成我正在寻找的东西。


此时我认为急切加载对我的情况来说是一个好方法,因为我可以避免N + 1 查询问题,因为我必须在关联对象上声明更多条件,以便:

  • 检索给定用户创建的关联对象的特定属性值(在我的情况下是指position值) ;
  • 将这些特定属性值中的每一个与相应的关联对象“关联”(以某种方式,以便position值适合于显示) 。
4

1 回答 1

0

我想,你正在寻找这个

@articles = Article.includes(:associated_categories)

这将急切地加载您的所有文章,包括它的两个关联(关联类别、关联类别)。因此,当您在视图中迭代 @articles 及其关联时,它将避免 N+1 问题并且不会触发查询。

于 2012-09-30T19:36:47.273 回答