在 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)
我有一个 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)