Запись скота создается при вызове save
(и нет ошибки проверки). Таким образом, одним из вариантов является создание истории внутри этого условия if
:
if @livestock.save
Другой вариант - использовать обратный вызов after_create
в модели livestock
, который создаст объект history
сразу после создания livestock
. Вы должны быть осторожны, потому что обратный вызов может быть вызван, когда он вам не нужен (т.е. при импорте данных).
Последний вариант - создать отдельный сервисный объект, который создаст livestock
и все другие необходимые объекты. Это, вероятно, лучший подход, но он потребует более индивидуального кода.
Обновление
Также убедитесь, что вы переместили блок if / else за пределы блока respond_to
:
if @livestock.save
# create history object here
respond_to do |format|
format.html { redirect_to @livestock }
flash[:success] = "Livestock was successfully created"
format.json { render :show, status: :created, location: @livestock}
end
else
respond_to do |format|
format.html { render :new }
format.json { render json: @livestock.errors, status: :unprocessable_entity }
end
end
Да, они могут кэшироваться. Но я не знаю, определяется ли поведение, что произойдет, должен, Вы иметь кэшируемую ссылку и сервер перезагружаетесь под ним. Можно протестировать тот сценарий, но поведение может меняться в зависимости от контейнера.
Если сервер уходит, ваши ссылки становятся недействительными.
Что касается кэширования в течение нормального жизненного цикла, это должно быть хорошо. Я делал это годами, как в EJB2, так и в EJB3, и у меня никогда не было проблем. Обычно у меня просто есть статический класс LookupServices, который просто ищет дом или возвращает существующий, если он уже есть, и сохраняет его на карте.