私は本当の難しさ、私の参加モデルの属性を設定する問題のまわりで私の頭を取得したのですか?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を得ることです:私は、すなわちただ一つのレコードを取得しますトロイターの新しい/同じことを行うアクションを作成します。
ありがとう@ D3mon-1stVFW、私はcontractel_controllerの作成アクションにcodeline.contract = contractを入れますか? codeline.units_alloc = 1もブール値ですか? – thomasvermaak
私はそれを見て、彼らがコードラインを作成するとき、彼らは既存の契約&コードから選んでいます。それ以外の場合は、ロジックに基づいて、オンザフライで作成することも、テーブルから見つけることもできます。そのページのコントローラーは、パスに基づいて移動します。私はそれがcodeline_controllerに行くのを見ます。ユニットallocは単なるブール値ではなく数値です。 –
もう一度...ありがとうございました...私は今すぐ走らなければなりませんが、明日はこの試合に臨み、答えとしてマークしていきます。レールよりも先に進んでいる他の誰かに会うのは素晴らしいです:) – thomasvermaak