Укажите текущие записи в методе класса Model
У меня есть метод класса, где я хочу изменить записи, которые в настоящее время захватываются ActiveRecord::Relation
объект. Но я не знаю, как ссылаться на текущую область видимости в методе класса. 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
вернул бы мне ActiveRecord::Relation
который содержит кучу User
записей. Затем я хочу изменить эти записи в методе этого класса, а затем вернуть их.
Проблема в том, что я не знаю, как явно ссылаться на "эту группу записей" в методе класса.
3 ответа
Ты можешь использовать 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
Этот код подразумевает, что у вас есть логический столбец is_admin
на столе пользователей.
Я бы сказал, что комбинация области с each
и метод экземпляра легче понять, чем метод класса. И в качестве бонуса это легче проверить, потому что вы можете проверить все этапы в отдельности:
Поэтому вместо 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)