如何返回嵌套资源的ActiveRecord关系

时间:2013-12-01 19:54:14

标签: ruby-on-rails ruby activerecord scope thinking-sphinx

我有一个文章课

class Article < ActiveRecord::Base
    belongs_to :category
end

and Category class

class Category < ActiveRecord::Base
    has_many :articles
    has_many :categories
    belongs_to :category
end

很快我就会在这篇文章模型上使用Thinking Sphinx搜索引擎。但我希望它仅用于具有特定类别的文章。 每个类别都有许多子类别。换句话说,它有许多子类别。那些子类别MIGHT(!)也有子类别。它可能看起来像这样:

Politics - World
         - Local

Sport - Football
      - Boxing - Amateur
               - Professional

因此,如果用户想要搜索政治,本地和世界都应该在桌面上,当他想要体育时,我们会经历足球,业余和职业拳击。 我的问题是我如何编写一个方法/范围来返回所有类别都在“选定”类别下的文章?请记住,我打算稍后使用ThinkingSphinx,因此它不能是简单易用的数组,我需要ActiveRecord Relation。

1 个答案:

答案 0 :(得分:1)

您可以递归地将类别和子类别ID放入单个数组中,然后在“where”子句中使用“IN”语句,如下所示:

class Category < ActiveRecord::Base

  ...

  def all_subcategory_ids
    cat_ids = []
    cat_ids << self.id
    self.categories.each do |category|
      cat_ids << category.id
      cat_ids << category.all_subcategory_ids
    end
    #since we have a mixed array of ids and sub-arrays, we need to flatten
    #the cat_ids array so it is just a one-dimensional array of ids [Ruby Array#flatten](http://ruby-doc.org/core-2.0.0/Array.html#method-i-flatten) 
    cat_ids.flatten
  end
end  

然后在您的文章模型中,您的范围将如下所示:

class Article < ActiveRecord::Base

  ...

  def self.in_category_and_subcategories(category)
    Article.where("category_id IN (?)", category.all_subcategory_ids)
  end
end