3

这是来自试图了解关注点和范围的 Rails 菜鸟的问题。

我一直认为范围是 rails 中的类方法,但前几天我从 DHH 看到了这段代码

module Visible
  extend ActiveSupport::Concern`

  module ClassMethods
    def visible_to(person)
      where \
        "(#{table_name}.bucket_id IN (?) AND
          #{table_name}.bucket_type = 'Project') OR
         (#{table_name}.bucket_id IN (?) AND
          #{table_name}.bucket_type = 'Calendar')",
        person.projects.pluck('projects.id'), 
        calendar_scope.pluck('calendars.id')
    end
  end
end

所以该visible方法的使用方式是这样的:

current_account.posts.visible_to(current_user)

这让我感到困惑。Self这是帖子的集合,因此我们正在对实例进行操作,而可见方法似乎旨在用作类方法。大卫不是试图将类方法称为动态范围吗?有人可以澄清一下吗?

4

1 回答 1

3

继承 ActiveRecord::Base 的类上的类方法也可以用作范围(在 ActiveRecord 关系对象上)。

由于模块 Visible 旨在混合到继承 ActiveRecord::Base 的模型中,因此它的类方法 visible_to 也可以用作范围。

如果这不能解决问题,您可以通过以下方式实现获取所有成人用户(年龄 > 20)的范围:

class User < ActiveRecord::Base
  scope :adult, lambda { where("age > ?", 20) } # with a scope

  class << self
    def adult # with class method
      where("age > ?", 20)
    end
  end
end

和使用它完全相同User.adult

于 2012-12-31T09:44:25.103 回答