我有一个文章课
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。
答案 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