Rails 3.0.5 belongs_to关联在声明类时不更新主键

时间:2011-03-14 01:09:53

标签: ruby-on-rails ruby-on-rails-3 activerecord associations belongs-to

我正在尝试执行基本的belongs_to / has_many关联,但遇到问题。似乎声明类的外键列没有更新。这是我的模特:


#
# 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

当我打开rails控制台时,我会执行以下操作:

#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 个答案:

答案 0 :(得分:3)

您只是不保存u1,因此无法更改数据库。

如果您希望在单个操作中分配和保存,请使用update_attribute

u1.update_attribute(:client, c1)

答案 1 :(得分:2)

是的,我想如果保存它,ID就会被设置。

第一种语法要好得多。如果您不想立即执行保存操作(创建适合您的操作),请使用build:

c1 = Client.create(:name => 'Urban Coding')
u1 = c1.units.build(:name => 'Birmingham Branch')
# do stuff with u1
u1.save

答案 2 :(得分:0)

这有效:

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

u1.client_id = c1.id

u1.save
c1.save

但另一种方式是创建它的更好方法。