如果关联对象还有其他条件,如何加载?

时间:2012-09-30 18:33:40

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

我正在使用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个对象( note :创建者用户由creator_user_id列标识category_associations数据库表)因为我需要显示position值(注意position属性,{{1} },act_as_list gem需要它,并且它是Integer数据库表中的一列“”靠近“每篇文章标题。

实际上,在我看来,我希望以正确的性能的方式制作类似以下的内容( note :它是假设category_associations中的每篇文章都是由用户“与类别相关联” - 用户引用了@articles所述的创建者用户:

category_associations

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


此时我认为热切加载对我的案例来说是一个很好的方法,因为我可以避免使用N + 1 queries problem,因为我必须在关联对象上声明更多条件,以便:

  • 检索由给定用户创建的 association 对象的特定属性值(在我的情况下,这些值指的是<% @articles.each do |article| %> <%= link_to(article.title, article_path(article)) %> (<%= # Display the article position in the given category %>) <% end %> 值);
  • “以相关方式”(以某种方式,使position值适合替换)将每个特定属性值添加到相应的关联的对象。

1 个答案:

答案 0 :(得分:0)

我想,你正在寻找这个

@articles = Article.includes(:associated_categories)

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