Как разделить массив между двумя классами, которые наследуются от разных классов

У меня есть приложение Rails с сервером PubSub (Faye) в качестве промежуточного программного обеспечения. У меня есть обычная структура Rails для моделей, представлений и контроллеров, и у меня есть несколько контроллеров для моих каналов Socket.. (При условии от FayeRails)

Проблема: мне нужно разделить список клиентов между моими контроллерами сокетов и моими обычными контроллерами. Это связано с тем, что аутентификация выполняется через контроллер Rails (поэтому я могу использовать сеансы).

Обычно я бы помещал такие вещи в свой ApplicationController, чтобы все унаследованные контроллеры и представления могли получить к нему доступ, но контроллеры сокетов унаследованы от FayeRails::Controller, так что это не вариант. Я понятия не имею, куда идут экземпляры этих контроллеров. Кроме того, я не могу редактировать инициализацию, потому что все контроллеры автоматически настраиваются Rails и гемом FayeRails. Я пытался использовать глобальные переменные, но это кажется неправильным. Также я думал об ActiveRecord, но мне кажется неправильным добавлять быстро меняющиеся данные в базу данных. Наконец, я подумал об ActiveRecord-подобном классе, который содержит список, но это похоже на глобальный..

Я не могу придумать никаких других вариантов для совместного использования списка клиентов между этими двумя контроллерами.

Какой был бы хороший и чистый способ сделать это?


person Tim Baas    schedule 17.04.2013    source источник
comment
Сессии пробовали? Или, может быть, кеш rails или Redis?   -  person omarvelous    schedule 18.04.2013
comment
Я не сталкивался с использованием сеансов в контроллерах Faye, никогда не использовал Redis или кеш Rails, но если эти проблемы решаются именно так, я обязательно их проверю! Я вернусь, чтобы сообщить вам, как они работают .. Спасибо!   -  person Tim Baas    schedule 18.04.2013
comment
Redis - это путь! Спасибо за вашу поддержку!   -  person Tim Baas    schedule 18.04.2013


Ответы (1)


Вы можете поместить то, что вам нужно, в модуль в каталоге lib. Включите его в свой application_controller, а затем расширьте основные контроллеры FayeRails, а также включите модуль туда. Чтобы расширить, просто создайте новый с тем же именем в вашем файле контроллера, возможно, убедитесь, что имя класса такое же, а затем потребуйте его в своем файле config/initializers/extensions.rb.

Пример

# config/initializers/extensions.rb
require "#{Rails.root}/app/controllers/whatever_controller.rb"

Что касается скорости, да, если вы беспокоитесь об этом, я бы рассмотрел возможность сохранения того, что вам нужно, в постоянной базе данных Redis. Но если FayesRails использует методы ActiveRecord, я не уверен, насколько это будет легко/сложно.

person JoshEmory    schedule 17.04.2013
comment
Сначала я попробую Redis, чем, я думаю, я смогу избежать использования сборки в обратных вызовах ActiveRecord Faye, я думаю.. Спасибо! - person Tim Baas; 18.04.2013
comment
Попробуйте Redis ATM, работает как надо! Я думаю, что я собираюсь обернуть логику Redis в модуль в папке lib на случай, если приложение разрастется, чтобы все было организовано.. Итак, еще раз спасибо! - person Tim Baas; 18.04.2013