У меня есть контроллер пользователей CRUD. Когда я открываю страницу «редактирования пользователя» в браузере, мой журнал показывает следующее:
Started GET "/users/1/edit" for 127.0.0.1 at 2011-06-21 20:09:37 +0200
Processing by UsersController#edit as HTML
Parameters: {"id"=>"1"}
User Load (0.2ms) SELECT `users`.* FROM `users` WHERE
`users`.`id` = ? LIMIT 1 [["id", 1]]
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE
`users`.`id` = ? LIMIT 1 [["id", "1"]]
В действии редактирования я просто вызываю частную функцию user, которая возвращает
@user ||= User.find(params[:id])
Представление выглядит следующим образом:
<%= settings_title(@user.username) %>
<%= form_for @user, :html => { :multipart => true } do |f| %>
<%= render "form", :user => @user
<div class="action"><%= submit_tag t("users.edit.submit"), :class => "button" %></div>
<%= end %>
Маршрут определяется как ресурсы: пользователи делают ...
Мы будем очень признательны за любую идею, как предотвратить второй доступ к базе данных!
Похоже, что второй выбор базы данных можно предотвратить, вызвав
@user ||= User.find(params[:id].to_i) # notice the .to_i
в действии редактирования. Теперь я получаю:
User Load (0.1ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = ? LIMIT 1 [["id", 1]]
CACHE (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = ? LIMIT 1
, но правильно ли это сделать? Вы видите какие-либо другие побочные эффекты этого решения?