我很难解决在我的连接模型中设置属性的问题?
我的模型:
class Contract < AR::Base
has_many :codelines
has_many :codes, :through => :codelines
accepts_nested_attributes_for :codes
attr_accessible :codes_attributes, :codes; :authnum, :st_date, :end_date
end
class Codeline < AR::Base
belongs_to :contract
belongs_to :code
units_alloc ...... this is the attribute I would like to set
end
class Code < AR::Base
has_many :codelines
has_many :contracts, :through => :codelines
end
我的 app/controllers/contracts_controller.rb 的新动作
def new
@contract = Contract.new
@contract.codes.build
end
我在 app/views/contracts/_fields.html.haml 中的部分视图
<fieldset><legend>Enter Billing Code Details</legend>
= f.fields_for :codes do |ff|
.field
= ff.label :name, "Code Name"
%br/
= ff.text_field :code_name
.field
.
.
= f.fields_for :codelines do |ff|
.field
= ff.label :name, "Units Alloc"
%br/
= ff.text_field :units_alloc, :precision => 6, :scale => 2, :size => 10
</fieldset>
通过阅读 Rails 指南、观看 railscasts #196 和 #197 以及研究互联网上的嵌套属性,我了解到我的 app/controllers/contracts_controller.rb 的新操作中的@contract.codes.build行不仅构建了code 对象,但它还构建了 codelines 对象。如果我像上面一样离开我的 app/controllers/contracts_controller.rb 的新操作,这正是发生的事情。我的代码行表填充如下:
id contract_id code_id units_alloc
1 1 1 .... @contract.codes.build
但是,如果您查看我的观点,我实际上想设置units_alloc,而@contract.codes.build这一行不允许我访问units_alloc,因为它位于代码线模型中。我将@contract.codelines.build添加到我的app/controllers/contracts_controller.rb 的新操作中,现在units_alloc 显示在我的视图中并且我可以设置它。但现在我的代码行表中有两行。一个来自@contract.codes.build,其中代码对象和代码行对象都被构建,第二行是@contract.codelines.build的结果,我的代码行表如下:
id contract_id code_id units_alloc
1 1 1 .... @contract.codes.build
2 1 80.00 .... @contract.codelines.build
我不应该能够通过@contract.codes.build 给出的第一个构建访问units_alloc,代码对象和代码行对象都是在其中构建的?
有谁知道我对这个问题的理解是否正确,或者你能指出我的资源将被揭示吗?
正如事后的想法,我通过代码行构建了代码对象,得到了相同的结果。
感谢您的任何建议。
更新 我可以让我的代码行表只有一条记录,其中所有关联的 id 设置如下:
我的控制台:
@contract = Contract.new(authnum: "900700", st_date: "2012-01-01", end_date:
"2012-30-06")
@contract.save
@code = Code.new(code_name: "S-5463", status: "Active", description:
"This and That")
@code.save
@codeline = @code.codelines.build(:units_alloc => "80.00", :contract => @contract)
@codeline.save
@codeline
=> #<Codeline id: 91, contract_id: 64, code_id: 54, units_alloc: 80.00>
使用 pgadmin3 我检查了我的代码行表,我只得到了一条记录,即:
id contract_id code_id units_alloc
91 64 54 80.00
现在测试是让我的contracts_controller new/create 操作来做同样的事情。