Вам трудно делать то, что вы хотите, потому что Rails предназначен , чтобы не иметь доступа к информации о сеансе в ваших моделях. Это классическое разделение проблем с MVC. Модели предназначены для работы независимо от других ваших слоев, и вы будете благодарны им, когда вы начнете делать что-то с Rake или другими системными задачами, когда у вас не будет сессии.
The
cattr_accessor :current_ip
это ужасный подход. Это взлом, и должно быть понятно почему. Да, это может сработать, но это неправильный подход к этой проблеме.
Поскольку вы отслеживаете "кто" сделал "что" по их IP, логическое место для этого - на уровне контроллера. Есть несколько подходов, которые вы можете использовать, включая использование CacheSweepers в качестве аудиторов, как описано в книге Rails Recipes. CacheSweepers могут наблюдать за моделями, но также имеют доступ ко всей информации контроллера. Используя атрибуты ditry в модели рельсов, вы можете точно увидеть, что изменилось.
@user = User.find_by_login "bphogan"
@user.login = "Brian"
@user.save
@user.changed
=> ["login"]
@user.changes
=> {"login"=>["bphogan", "brian"]}
@user.login_was
=> "bphogan"
Объедините это с имеющейся у вас информацией о сеансе, и у вас получится довольно классный одитор.
Это помогает?