2013-05-30 4 views
0

Я хочу реализовать функциональность сообщений для отображения на разных страницах моего сайта. Я создал модель для этого, которая содержит поля, скажем page, message, active. Если active=false сообщение не будет отображаться. Это прекрасно работает.Глобальная переменная модели Rails

Теперь я хочу добавить возможность включения/выключения всех сообщений в течение некоторого времени. Я не хочу обновлять каждое сообщение и устанавливать active=false, потому что 1) может быть много сообщений, 2) мне нужно было бы сохранить, какие сообщения были активны/неактивны в момент выключения, чтобы восстановить исходное состояние при возврате на.

Это было бы очень удобно, если бы я мог использовать новую переменную «class-wide» @@active в моей модели. Однако использование многопоточного приложения (я использую unicorn) может вызвать проблемы, потому что @@active не будет использоваться для всех процессов.

Я не смог найти хорошие решения для этого, может быть, кто-то может помочь?

+0

Если вы создали переменную экземпляра в своем прикладном контроллере, «единорог» сделает ее видимой во всех процессах? Если это так, вы можете рассмотреть этот маршрут: используйте переменную экземпляра в вашем 'application_controller.rb' как« переменную состояния »для сеанса. – lurker

ответ

0

Возможно создать переменную среды с именем DISABLE_ALL_MESSAGES и затем переопределить метод message#active обратиться к ENV["DISABLE_ALL_MESSAGES"]:

def active 
    ENV["DISABLE_ALL_MESSAGES"] && super 
end 

Другим вариантом было бы, чтобы сохранить настройки в базе данных и обращаться к нему подобным образом.

+0

Я бы подумал, что хранить его в базе данных было бы лучшим решением, поскольку оно позволяет избежать проблем с потоками и упрощает администрирование администратора по умолчанию для всех потоков. –

+0

Если вы размещаете на сервисе вроде Heroku или AppFog, смешно легко изменить переменную окружения. Но вы правы, что может быть проще сохранить его в базе данных в зависимости от обстоятельств. –

0

Попробуйте установить preload_app = true в конфигурации вашего единорога. Это позволяет мастер-процессу единорога предварительно загружать приложение, а все остальные сотрудники совместно используют загруженную структуру данных. Возможно, вам захочется перейти на Ruby Enterprise Edition для обмена памятью между процессами.

Смежные вопросы