我很难解决在连接模型中设置属性的问题吗?
我的模特:
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指南和观看有轨电视#196和#197以及在互联网上研究嵌套属性后,我开始理解我的应用程序的新操作中的 @ contract.codes.build 行/controllers/contracts_controller.rb不仅构建了代码对象,还构建了代码行对象。如果我将我的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
现在测试是让我的contract_controller new / create动作做同样的事情。
答案 0 :(得分:0)
对于新的,
现有合同与现有代码。将它们捆绑在一起。
使用这两个ID和units_alloc
创建代码行codeline.contract = contract
codeline.code = code
codeline.units_alloc = 1
codeline.save
当你想要展示时
使用Codeline.all
如果您有动态创建的新对象列表,例如Array.new
post.comments.build
为我的帖子构建一个新的空注释数组而不是nil
我希望这会有所帮助。我自己是新手。
修改
首次访问该页面时,该应用会尝试创建新的代码行,直到保存为止
@codeline = Codeline.new
@codeline.contract = Contract.new #or find it from the table, depends on the logic
@codeline.code = Code.new
@codeline.units_alloc = 0 #default value
答案 1 :(得分:0)
我在这个网站debugging nested_forms找到了一个解决方案。
这是你读过的第九个项目,如果你正在使用has_many:通过关联,那么你需要将你的nested_form基于连接模型或接近它的东西。
我通过在这里和那里重构一些代码来快速运行测试,现在我有一个可行的嵌套表单,它向控制器提供正确的参数,然后控制器正确地处理它,我的代码行表现在只有一个记录。