2012-03-26 5 views
0

私は本当の難しさ、私の参加モデルの属性を設定する問題のまわりで私の頭を取得したのですか?has_many:throughアソシエーションとその結合モデル属性はどのように相互作用しますか?

マイモデル:

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ガイドを読み、railscasts#196と#197を見てネストされた属性を調べているからインターネット上で私は私のアプリ/コントローラ/ 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へのアクセス権を与えるものではありませんunits_allocとcontract.codes.build @この行を設定したいと思いますコードラインモデルで。私は私のアプリ/コントローラ/ contracts_controller.rbの新しいアクションにcontract.codelines.build @を追加し、今units_allocは、私の見解で示しており、私はそれを設定することができています。しかし、今私は私のコードラインテーブルに2つの行があります。 @ contract.codes.buildの結果、コードオブジェクトとコードラインオブジェクトの両方が構築され、2行目は@ 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が設定されていますと1つのレコードだけを持つように私のコードラインのテーブルを取得することができます。

マイコンソール:

@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を得ることです:私は、すなわちただ一つのレコードを取得しますトロイターの新しい/同じことを行うアクションを作成します。

答えて

0

保存されるまで、新しいコードラインを作成しようとするページを訪問し、私はこのサイトで、debugging nested_formsで解決策を見つけました。

has_many:throughアソシエーションを使用している場合は、結合モデルまたはそれに近いものに基づいてnested_formを作成する必要があります。

ここでいくつかのコードをリファクタリングしてすぐにテストを実行しました。コントローラに正しいパラメータを提供する実行可能なネストされたフォームを使用しています。コントローラはこれを正しく処理し、コードラインテーブルにはただ1レコードしかありません。

0

新品の場合

既存のコードとの既存の契約。一緒に縛ってください。

あなたはあなたが欲しいオブジェクトの新しいリストを持っている場合

使用Codeline.all


を表示したい場合には、これら2つのIDを使用してコードラインとunits_alloc

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

codeline.save 

を作成します。 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、私はcontractel_controllerの作成アクションにcodeline.contract = contractを入れますか? codeline.units_alloc = 1もブール値ですか? – thomasvermaak

+0

私はそれを見て、彼らがコードラインを作成するとき、彼らは既存の契約&コードから選んでいます。それ以外の場合は、ロジックに基づいて、オンザフライで作成することも、テーブルから見つけることもできます。そのページのコントローラーは、パスに基づいて移動します。私はそれがcodeline_controllerに行くのを見ます。ユニットallocは単なるブール値ではなく数値です。 –

+0

もう一度...ありがとうございました...私は今すぐ走らなければなりませんが、明日はこの試合に臨み、答えとしてマークしていきます。レールよりも先に進んでいる他の誰かに会うのは素晴らしいです:) – thomasvermaak

関連する問題