Укажите текущие записи в методе класса 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)
Другие вопросы по тегам