次の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 に反映されないのはなぜですか? そして、どうすればそれを伝播させることができますか?