class User < ApplicationRecord
scope :active, -> { where(active: true) }
def some_method_in_user_model
users = active # -> is this right or
users = User.active # is this right?
# additional code
end
end
我认为两者都有效,但哪一个更好?
两者都有效,但它们做不同的事情。
作用域本质上是一个类方法。这个:
scope :active, -> { where(active: true) }
相当于:
def self.active
where(active: true)
end
因此
users = User.active
为您提供 users
中的所有活跃用户作为查询。
您的模型中还有一个
active
属性,因此:
users = active
在实例方法中,它在语法上有效并且不会引发异常。但是,这将为您提供
nil
中的布尔值(或可能是 users
),这可能不是您正在寻找的内容,也不是变量名称所暗示的内容。
如果您想访问实例方法中的范围,您需要:
def some_method
users = User.active
# or even `users = self.class.active`
end
如果您想访问另一个类方法中的范围,您需要:
def self.some_class_method
users = active
# or `users = User.active`
end