0

我有 2 个模型,State并且Office.

Office has_one State
Office name: string, city: string, state: State

State belongs_to Office 
State name: string, Abbrv: string

我是红宝石的新手,所以我正在弄清楚它是如何工作的。我认为创建一个Office将是:

Office.create( name: 'The Building', city: 'Kansas', state: State.first )

当我查看保存的内容时,我得到了state: nil

我究竟做错了什么?

4

2 回答 2

0

澄清..您创建模型之间的关联和表之间的关系。要创建一对一的关联,您可以分别设置has_one:name_of_the_child_model、 或belongs_to :name_of_the_parent_model。在您的示例中:

class Office < ActiveRecord::Base
attr_accessible :name, :city
has_one :state
end

类状态 < ActiveRecord::Base
attr_accessible :name, :abbrv
belongs_to :office
end

之后,您创建相应表之间的关系。您可以通过将父表(Office 模型)的主键设置为子表(State 模型)中的新字段/列来做到这一点,因此 State 模型如下所示:

类状态 < ActiveRecord::Base
attr_accessible :name, :abbrv, :office_id
belongs_to :office
end

要一步实例化并在 Office 对象上保存一个新的 State 对象,您可以使用.create_modelname(attributes={})方法:
office = Office.find(id)
office.create_state({name: "state_name", abbr: "abbrv"}).

你得到了nil因为State.first只是试图从你之前没有写入的状态表中读取第一个对象。

于 2013-07-19T21:21:46.503 回答
0

看起来您的数据库表使用:state而不是:state_id. Office 应该在数据库中有一个名为:state_id.

当你在 Office 上调用 save 时,它​​会保存状态的 id。当您调用office.state它时,它将自动从数据库中获取状态。当你调用它时,如果它还没有持久化到数据库,office.save它也会保存附件。state

于 2013-07-19T16:24:15.540 回答