В rails 3.0.9 / ruby 1.9.2 я получаю неожиданное поведение при попытке обновить внешние ключи модели.
Я начинаю с новой установки
$ rails new mytest
$ rails g model User
$ rails g model Ad user_id:integer
$ rake db_migrate
Добавитьассоциация в приложении / models / Ad.rb
Class User < ActiveRecord::Base
belongs_to :user
end
Теперь самое интересное.Я хочу изменить внешний ключ на объекте напрямую.Я вхожу в консоль рельсов с рельсами c
$ u = User.create
$ a=Ad.create(:user=>u)
$ a.update_attributes(:user_id => 9999)
$ a.user_id
=> 4
Так что это не работает.Я пытаюсь установить объект напрямую, а не передавать его для создания:
$ u = User.create
$ a=Ad.create
$ a.user = u
$ a.save
$ a.update_attributes(:user_id => 9999)
$ a.user_id
=> 5
Не работает.
Единственное, что работает, это:
$ u = User.create
$ a=Ad.create
$ a.user_id = u.id
$ a.save
$ a.update_attributes(:user_id => 9999)
$ a.user_id
=> 9999
Может кто-нибудь объяснить, что происходит, и как я могу изменить внешние ключи моих объектов?Я предполагаю, что «блокирующее» поведение происходит, когда создаются ассоциации объектов и возникает конфликт, поэтому один из ответов заключается в следующем:
$ Ad.find( a.id ).update_attributes( :user_id => xxxx )
Это работает.Но кажется, что для изменения внешнего ключа объекта нужно пройти долгий путь.Это также требует дополнительного попадания в БД, и, наконец, это довольно грязный код, если объект внутренне нуждается в обновлении.Что делать?