1

次の2つのモデルがあります。

class Process < ActiveRecord::Base

 has_many :activities, inverse_of: :artifact, dependent: :destroy
 attr_accessible :name, :activities_attributes
 def update_status!
   if self.activities.all? {|a| a.completed? }
     self.status = 'completed'
   elsif self.activities.any? {|a| a.completed? }
     self.status = 'in_progress'
   else
     self.status = 'not_started'
   end

   save!
 end
end

class Activity < ActiveRecord::Base
    belongs_to :process, inverse_of: :activities
    attr_accessible :name,:completed_date
    scope :completed, where("completed_date is not null")
end

次に、コントローラーで:

 @activity = Activity.find(params[:id])
 @activity.completed_date = Time.now
 @activity.process.update_status!

この行の直後にデバッガーを配置して @activity.completed を出力すると、true が返されますが、@artifact.status はまだ「not_started」です (他のアクティビティはないと仮定します)。

ただし、更新前に次の行を追加すると:

 @activity.process.activities[@activity.process.activities.index(@activity)] = @activity

ステータスは正しく更新されます。

@activity への変更が process.activities に反映されないのはなぜですか? そして、どうすればそれを伝播させることができますか?

4

1 に答える 1

3

inverse_ofこれは has_many では機能しません。この記事を参照してください: ActiveRecord :inverse_of が has_many で機能しない :through 作成時の結合モデルで

RailsGuidesからの関連する宣伝文句は次のとおりです。

inverse_of のサポートにはいくつかの制限があります。

:through アソシエーションでは機能しません。:polymorphic 関連では機能しません。:as アソシエーションでは機能しません。belongs_to アソシエーションの場合、has_many 逆アソシエーションは無視されます。

于 2013-08-09T01:25:42.533 に答える