在同一模型中使用scope时是否需要使用Class.scope_name,还是可以只使用scope_name?

问题描述 投票:0回答:1
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

我认为两者都有效,但哪一个更好?

ruby-on-rails rails-activerecord
1个回答
0
投票

两者都有效,但它们做不同的事情。

作用域本质上是一个类方法。这个:

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
© www.soinside.com 2019 - 2024. All rights reserved.