0

それぞれが入れ子になっている 3 つのモデルがあるとします。最上位オブジェクトを作成し、他の子オブジェクトを build_* にすると、元のインスタンスの save() 前後のリレーションシップを通じてすべての子オブジェクトを取得できます。ただし、 find(:id) の後に第 2 レベルのネストされたオブジェクトを取得しようとすると、元の親は失敗します。ただし、第 1 レベルのネストされたオブジェクトは取得できます。これは通常コントローラーで発生しますが、以下のコンソール出力で説明します。

私は何を見落としていますか?

前もって感謝します!
~jpv

>> l = Lead.new :buyer_name => 'キム・ポッシブル', :email => 'kim@possible.com', :phone => '7131231234'
>> l.build_buyer
>> l.buyer.name = 'キム バイヤー'
>> l.バイヤー
>> l.buyer.build_contact_detail
>> l.buyer.contact_detail.email = "kim-contact-detail@possible.com"
>> l.save #true を返す
>> l.buyer #THIS WORKS
=> #<バイヤー ID: 1、名前: "キム バイヤー"、リード ID: 1>
>> l.buyer.contact_detail #THIS WORKS
=> #<ContactDetail id: 1、company_id: nil、buyer_id: 1、email: nil、address_line_1: nil、address_line_2: nil、city: nil、state: nil、postal_code: nil>
>> l2 = Lead.find(1)
=> #<リード ID: 1、company_id: nil、buyer_id: nil、public_lead_id: nil、buyer_name: "キム ポッシブル"、company_name: nil、メール: "kim@possible.com"、電話: "7131231234">
>> l2.buyer #これは期待どおりに動作します
=> #<バイヤー ID: 1、名前: "キム バイヤー"、リード ID: 1>
>> l2.buyer.contact_detail #THIS BREAKS
=>なし

以下のすべてのボイラープレートのもの:

クラスリーダー
  has_one :買い手
  #...
終わり

クラス バイヤー
  has_one :contact_detail
  所属先:リード
  #...
終わり

クラス ContactDetail
  所属先:バイヤー
  #...
終わり

適切な外部キーは、「belongs_to」クラスのそれぞれにあります。

クラス CreateBuyers < ActiveRecord::Migration
  デフセルフアップ
    create_table :buyers do |t|
      t.string :名前
      t.integer :lead_id
...

class CreateContactDetails < ActiveRecord::Migration
  デフセルフアップ
    create_table :contact_details do |t|
      t.integer :buyer_id
4

2 に答える 2

1

オブジェクトがネストされた子オブジェクトを熱心にロードすることを期待しているため、つまずいている可能性があると思います。一般に、検索でそれを行うには、明示的に指定する必要があります。検索のオプションに :include => [:borrower, {:borrower => :contact_detail}] を追加してみて、それが機能するかどうかを確認してください。

于 2010-01-04T02:34:09.313 に答える
0

あなたがそうするなら、これはうまくいきますか...

l.buyer.name = 'kim buyer'
l.save
l.buyer.build_contact_detail
...

もしそうなら、これは Rails のバグで、ContactDetail オブジェクトが作成時にそのパパが誰であるかを実際には認識していない可能性があります。

于 2009-12-31T19:01:20.507 に答える