在 Model class 方法中指定当前抓取的记录

Specify currently grabbed records within Model class method

我有一个 class 方法,我想在其中修改当前被 ActiveRecord::Relation 对象抓取的记录。但是我不知道如何在 class 方法中引用当前范围。 self 不做。

示例:

class User < ActiveRecord::Base
  ...

  def self.modify_those_records
    #thought implicitly #to_a would be called on currently grabbed records but doesn't work
    temp_users_to_a = to_a
    ...
  end
end

我会这样使用它:

User.some_scope.modify_those_records

所以 User.some_scope 对我来说 return 一个包含一堆 User 记录的 ActiveRecord::Relation。然后我想在 class 方法中修改那些记录,然后 return 它们。

问题是:我不知道如何在 class 方法中明确引用 "that group of records"。

您可以使用 current_scope:

def self.modify_those_records
  current_scope.each do |user|
    user.do_something!
  end
end

如果您想根据用户的管理员权限对用户进行排序,您最好使用 ActiveRecord:

scope :order_admins_first, order('CASE WHEN is_admin = true THEN 0 ELSE 1 END, id')
User.some_scope.order_admins_first

此代码暗示您在用户 table.

上有一个布尔列 is_admin

我认为范围与 each 和实例方法的组合比 class 方法更容易理解。作为奖励,它更容易测试,因为您可以单独测试所有步骤:

因此,我会做以下事情而不是 User.some_scope.modify_those_records

User.some_scope.each(&:modify)

并实现一个实例方法:

# in user.rb
def modify
  # whatever needs to be done
end

如果您只想修改记录的顺序 - 更好的方法是向模型添加一个排序字段(如果您还没有)并按它排序。

User.some_scope.order(name: :asc).order(is_admin: :desc)