2

次の2つのクラスがあります

 class Car < Vehicle
   has_one :steering_wheel, as: :attached
 end

 class SteeringWheel < ActiveRecord::Base
   belongs_to :attached

   has_many :components
   has_one :rim, class_name: 'Components', order: 'id DESC'
   attr_accessible :components
 end

 class Component < ActiveRecord::Base
    include SpecificationFileService::Client

    attr_accessible :created_by
    belongs_to :steering_wheel 
 end

次に、私の仕様では:

context "given an attachment", :js do
  before do
    @car = create(:car, make: "honda")
    @steering_wheel = SteeringWheel.create(attached: @car)
    @steering_wheel.save
    @car.save
    @car.reload
  end
  specify "test the setup", :js do
    puts @car.steering_wheel
  end
end

どちらが印刷されますか:nil

私が修正を見つけた方法は、次のように明示的に車にsteering_wheelを設定することです:

 @car.steering_wheel = @steering_wheel

の直前save

編集:

以下のコメントで示唆されているように、polymorphic: true を追加してみましたが、問題は解決しませんでした。また、上記の SteeringWheel モデルをさらに肉付けしました。

私の質問は、なぜ、これをコールバックチェーンに暗黙的に追加するにはどうすればよいですか

4

1 に答える 1

1

コメントで言及されている @abraham-p のように、belongs_to関係を次のように宣言する必要があります。

belongs_to :attached, polymorphic: true

それ以外の場合は、モデルを検索しようとします。モデルAttachedに次のフィールドを必ず含めてください。SteeringWheel

attached_type
attached_id

残りはRailsによって解決されます:)

于 2013-03-07T22:50:05.483 に答える