Rails 3.0.5 принадлежит ассоциация не обновляет первичный ключ в объявлении класса - PullRequest
0 голосов
/ 14 марта 2011

Я пытаюсь создать базовую ассоциацию принадлежащих к хасу, но столкнулся с проблемой.Кажется, что объявленный столбец внешнего ключа класса не обновляется.Вот мои модели:


#
# Table name: clients
#
#  id         :integer         not null, primary key
#  name       :string(255)
#  created_at :datetime
#  updated_at :datetime
#

class Client < ActiveRecord::Base
  has_many :units
  ...
  attr_accessible :name
end

#
# Table name: units
#
#  id         :integer         not null, primary key
#  client_id  :integer
#  name       :string(255)
#  created_at :datetime
#  updated_at :datetime
#

class Unit < ActiveRecord::Base
  belongs_to :client
  ...
  attr_accessible :name
end

Когда я открываю консоль рельсов, я делаю следующее:

#This works as it should
c1 = Client.create(:name => 'Urban Coding')
u1 = c1.units.create(:name => 'Birmingham Branch')

Выше приведены правильные результаты.У меня есть клиент и подразделение.В блоке правильно заполнено поле внешнего ключа client_id.

#This does not work.
c1 = Client.create(:name => 'Urban Coding')
u1 = Unit.create(:name => 'Birmingham Branch')

u1.client = c1

Я чувствую, что вышеупомянутое должно иметь тот же эффект.Однако, это не так.У меня есть юнит и клиент, но столбец Единицы client_id не заполнен.Не уверен, что именно я делаю не так здесь.Помощь приветствуется.Дайте мне знать, если вам нужна дополнительная информация.

Ответы [ 3 ]

3 голосов
/ 14 марта 2011

Вы просто не сохраняете u1, следовательно, без изменений в базе данных.

Если вы хотите, чтобы он был назначен и сохранен в одной операции, используйте update_attribute

u1.update_attribute(:client, c1)
2 голосов
/ 14 марта 2011

Да, я думаю, что если вы сохраните его, идентификатор будет установлен.

Первый синтаксис намного лучше.Если вы не хотите сразу выполнять действие сохранения, которое создает для вас create, используйте build:

c1 = Client.create(:name => 'Urban Coding')
u1 = c1.units.build(:name => 'Birmingham Branch')
# do stuff with u1
u1.save
0 голосов
/ 14 марта 2011

Это работает:

c1 = Client.create(:name => 'Urban Coding')
u1 = Unit.create(:name => 'Birmingham Branch')

u1.client_id = c1.id

u1.save
c1.save

, но другой способ - лучший способ его создать.

...