2012-03-26 71 views
0

我真的很難讓我的頭在我的連接模型中設置屬性的問題?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新/創建行動來做同樣的事情。

回答

0

我發現在這個網站,debugging nested_forms的解決方案。

這是第九子彈下來,你看,如果你用的has_many工作:通過關聯,那麼你需要立足於加盟模式或東西接近你nested_form。

我通過重構一些代碼在這裏和那裏迅速運行測試,現在我有一個可行的嵌套表單,它向控制器提供正確的參數,然後正確處理它,並且我的代碼行表現在只有一條記錄。

0

對於新的,

與現有代碼的現有合同。把它們綁在一起。

使用這兩個ID和units_alloc

codeline.contract = contract 
codeline.code = code 
codeline.units_alloc = 1 

codeline.save 

創建代碼行。當你想顯示

使用Codeline.all


當你有你想要的對象新名單創建上的蒼蠅,像Array.new

post.comments.build 

爲我的帖子構建一個空的評論的新陣列,而不是它爲零

我希望這可以幫助。我是新來的自己。

編輯

第一次訪問該頁面的應用程序將嘗試創建一個新的程序代碼,直到它被保存

@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 
+0

感謝@ D3mon-1stVFW,做我把codeline.contract =合同在我的我的contracts_controller的創建操作。也是codeline.units_alloc = 1布爾? – thomasvermaak 2012-03-26 20:22:28

+0

我看它的方式是,當他們創建一個代碼行,他們是從現有的合同及代碼採摘。否則,根據邏輯,它們可以立即創建,也可以從表中找到。該頁面的控制器是基於路徑的地方。我看到它在codeline_controller中。單位alloc只是一個數字,而不是布爾值。 – 2012-03-26 20:34:51

+0

再次感謝......我現在已經運行,但我會用這個,明天打,然後標記爲答覆你的反應......極大地滿足了別人誰是新的軌道......雖然更先進的比我:) – thomasvermaak 2012-03-26 20:40:49

相關問題