加入Ruby中的命名范围

时间:2014-05-15 08:37:06

标签: sql ruby scope acts-as-tree

我最初问过关于acts_as_tree的这个问题,但它看起来更一般,所以我在这里稍微改写一下。 我有一个使用acts_as_tree的模型“类别”。我经常发现自己需要将其与其他模型一起用于各种查询,但我不知道如何使用提供的范围,如子,祖先,兄弟,后代来创建我需要的条件。

具体例子:

class Category < ActiveRecord::Base
  acts_as_tree
  has_many :photo
end

class Photo
  belongs_to :category
end

cat = Category.first

如何查询猫的孩子的所有照片或其兄弟姐妹的所有照片? 好像我需要这样的东西:

Photo.joins(cat.children)
Photo.joins(cat.siblings)

我知道这不是一个有效的代码。

1 个答案:

答案 0 :(得分:0)

由于act_as_tree并不真正使用范围​​而是返回结果的方法,因此您可以这样做:

class Photo
  belongs_to :category

  scope :from_category, -> (category) {
      joins(:category).where(category: category)
  }
end

cat = Category.first

Photo.from_category(cat.children)
Photo.from_category(cat.siblings)

这应该有用。