我真的很難讓我的頭在我的連接模型中設置屬性的問題?has_many:通過關聯和它的連接模型屬性如何交互?
我的模型:
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
我的應用程序/控制器/ contracts_controller.rb的新動作
def new
@contract = Contract.new
@contract.codes.build
end
部分爲我的應用程序/視圖/合同/ _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和研究嵌套屬性在互聯網上我瞭解到,我的app/controllers/contracts_controller.rb的新動作中的@ contract.codes.build行不僅構建了代碼對象,還構建了代碼行對象。如果我像上面那樣離開我的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添加到我的應用程序/ 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_con troller新/創建行動來做同樣的事情。
感謝@ D3mon-1stVFW,做我把codeline.contract =合同在我的我的contracts_controller的創建操作。也是codeline.units_alloc = 1布爾? – thomasvermaak 2012-03-26 20:22:28
我看它的方式是,當他們創建一個代碼行,他們是從現有的合同及代碼採摘。否則,根據邏輯,它們可以立即創建,也可以從表中找到。該頁面的控制器是基於路徑的地方。我看到它在codeline_controller中。單位alloc只是一個數字,而不是布爾值。 – 2012-03-26 20:34:51
再次感謝......我現在已經運行,但我會用這個,明天打,然後標記爲答覆你的反應......極大地滿足了別人誰是新的軌道......雖然更先進的比我:) – thomasvermaak 2012-03-26 20:40:49