Задать вопрос

Как загрузить хелпер после загрузки моделей при старте рельс?

Есть модель User и связанная с ней таблица пользователей. Один из пользователей администратор. Есть куча контроллеров и во многих из них для администратора создается уведомление - запись в специальной таблице.
Сейчас перед тем как отправить администратору уведомление пишется примерно такой код:
admin = User.where(admin: true).first
Notification.create(user_id: admin.id, .......)

Т.е. как собрались отправлять уведомление - выбираем из таблицы администратора и выполняем над ним действия.
Хочу сделать класс Admin, который при старте приложения выберет администратора один раз, а потом обращаться к методу класса этого Admin для получения записи администратора из любого контроллера.
Неудачная попытка:
application_helper.rb
module ApplicationHelper
class Admin
	@@admin = User.where(admin: true).first
	if @@admin
		puts '::Admin loaded'
	else
		puts '::Admin absent !!!!!!!!'
	end

	class << self
		def get
			@@admin
		end
	end
end
end


какой нибудь контроллер:
def some action
 admin = Admin.get
 Notification.create(user_id: admin.id, .......)
end

Возникает ошибка циклической ссылки. Т.е. я так понимаю загрузка кода хелпера стартует до загрузки кода моделей.
Вообще мне не обязательно Admin пихать в хелпер, просто необходимо, чтобы класс Admin инициализировался после User и был доступен в теле контроллеров. Как сделать? помогите пожалуйста

PS как вы поняли я не хочу создавать экземпляр класса Admin а непосредственно обращаться к методу класса
  • Вопрос задан
  • 124 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
sharikov_d
@sharikov_d
Мне стыдно за ваши вопросы и ответы
Если твой админ статичен, то ты можешь его данные вообще заткнуть в YAML/жисон/любой другой формат и подгрузить как константы в том же инишиалайзере.

В конце концов, ты можешь сделать так:
# user.rb

def self.admin
  where(admin: true).first
end


лучше объясни зачем тебе такая оптимизация, думается мне, что ты не туда думаешь
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы