Тут только пробовать. Ставите сайдкик, лучше 3ю версию, 4ая еще не обкатана. И смотрите как быстро выполняется и как нагружает сервер. Выбираете оптимальные настройки.
Сайдкик должен без проблем установиться, он совместим с Resque. Даже задачи очереди должен подхватить
Strollager: Давайте поясню момент, который меня смущает. Мне кажется, что либо тут не все гладко, либо я не доконца понимаю Вашу структуру
= cache ['menu', Menu.latest]
- menu.each do |item|
Вызов этого кеша нужен для того, чтобы избежать запроса
Menu.find_by(:code => code).children
Т.е кешируется вызов к модели Menu, но ключ кеша, по которому определяется актуальнен кеш или нет строится по другой модели -
MenuTranslation.order(:updated_at).last
И еще в этом кеше никак не учавствует код меню - "header_menu". Вы пробовали одновременно выводить 2 закешированнных меню? Если у вас для другого меню другой паршиал, то лучше не делать вот так render_menu("header_menu", "common/menu") а создать по хелперу для каждого меню.
Все зависит от задачи. Стандартом является мой первый ответ, потому что приложение не должно выводить ссылки на несуществующие объекты, а значит и переходов по ним быть не может. Если кто-то намеренно пытается подставлять несуществующий id или администратор удалил запись (т.е. довольно редкий случай) - простой редирект на главную является достаточно нормальным поведением, либо отображение 404 страницы. Т.е. переход по такой ссылки не является вашим юзкейсом и Вам всего линь нужно обработать исключительную ситуацию, то используем перехват исключений
Если есть именно задача, проверять есть ли запись и отправлять на корень - тогда мы пишем явный код, используя специально созданный для этого механизм - фильтры в контроллерах.
Т.е. обобщая - если переход по ссылке исключительтая ситуация, то искпользуем find который выбросит исключение. Если нормальная - используем find_by_id и проверяем результат.
User.transaction do
@user.positions.where(company: @company).delete_all
user_positions_params.each do |position|
@user.positions.create(company: @company, name: position[:name])
end
end
Если рассматривать Ваш пример - company_id - не самый лучшай вариант для идентефикации компании. Компания наверняка как-то связана с текущим залогиненым пользователем и искать ее нужно от него.
def user_positions_params
params.require(:user).permit(position_attributes: [::name])
end
Врятли мой код будет работать, но мысль верная. Надо разобраться со strong params, удалить все текущеи связи с компанией и создать новые
Сайдкик должен без проблем установиться, он совместим с Resque. Даже задачи очереди должен подхватить