2015-05-12 2 views
0

У меня есть связь с идентификатором, но внешний ключ не устанавливается.Rails обновляет внешний ключ с идентификатором ассоциации

Некоторые настройки:

Foo has_many :bars 
Bar belongs_to :foo 

foo = Foo.new.save 
bar = Bar.new(foo: foo) 

Выход:

bar.foo = foo 
bar.foo.id = 1 
bar.foo_id = nil # Why is this nil!? 

Кроме назначения bar.foo_id = 1, есть способ, чтобы обновить соответствующий внешний ключ, так bar.foo_id == 1без сохранения?

Должен быть какой-то метод #update_foreign_keys, или #update_associations, так?

Я бегу Rails 4.2 с Рубином 2.1.2

+0

Почему бы вам просто не сохранить 'bar', если вы установили его атрибут' foo' в 'foo'? Итак, что-то вроде этого: 'bar.foo = foo; bar.save; ставит bar.foo_id'. – newmediafreak

+0

try 'foo = Foo.build'' bar = foo.bars.create (foo: foo) ' – Sontya

+0

спасибо за ввод, мне нужно сделать это без сохранения. –

ответ

1

Идентификатор устанавливается в базе данных, а не по рельсам, поэтому пусто.

Вам нужно сохранить каждый объект, чтобы получить идентификатор.

Вы можете сохранить объект в транзакции, чтобы получить его, если вам нужно, чтобы выполнить любую магию.

А о коде:

bar.foo = foo 
bar.foo.id = 1   <- This retrieves the ruby#object_id 
bar.foo_id = nil   <- This retrieves the database#id 

Вот почему второй один равен нулю.