急于加载“二度”关联对象的麻烦

时间:2012-03-09 06:29:35

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

我正在运行Ruby on Rails 3.1。我想通过应用一些条件来加载“二度”相关对象,但我遇到了麻烦。

似乎我已经通过使用:

解决了part of my issue
article_categories =
  article
    .categories
    .includes(:comments => [:category_relationships])
    .where(:category_relationships => {:user_id => @current_user.id})

其中涉及的类别如下:

class Category < ActiveRecord::Base
  has_many :comment_relationships
  has_many :comments,
    :through => :comment_relationships

  ...
end

class Comment < ActiveRecord::Base
  has_many :category_relationships
  has_many :categories,
    :through => :category_relationships

  ...
end

以上代码(似乎做得对):

  1. 通过关注categories has_many :through关联(即关注:category_relationships条件)加载所有.where(:category_relationships => {:user_id => @current_user.id});
  2. 急切加载所有article.comments.where(:user_id => @current_user.id)
  3. 但是,我想再做一些:

    1. 订单categories中的:position属性检索category_relationships,以便生成的article_categories 按位置排序< / em>的;
    2. 急切加载还有category_relationshipuser_id == @current_user.id对象,因为上面的代码没有这样做。
    3. 如何利用热切加载来实现这一目标?

1 个答案:

答案 0 :(得分:0)

解决方案:

  1. .order( “category_relationships.position”)

  2. 想象一下,急切加载是带有一些过滤的cartessian产品,所以“where”过滤了include的最终结果(真正的左连接)。但是可以使用带有子查询的where来完成,首先会按用户过滤类别,然后可以移除您的位置。