1

次のようなモデルがあります。

class WorkRequest < ActiveRecord::Base
  attr_accessible :upload, :assigned_to_staff
  serialize :assigned_to_staff, Array

  before_save :set_old_staff
  def set_old_staff
    @old_staff = self.assigned_to_staff_was
  end

  def staff_changed?
    !self.assigned_to_staff.empty? && self.assigned_to_staff != @old_staff
  end
end

スタッフの割り当ての変更がいつ行われたかを追跡するために、 self.assigned_to_was を利用しようとしています。シリアル化されたフィールドの動作が通常のフィールドと異なることに気付きました。以下のコンソール出力は、:upload (テキスト文字列フィールド) とシリアル化された :assigned_to_staff で異なる動作を示しています。

1.9.2-p320 :002 > wr.upload
 => nil 
1.9.2-p320 :003 > wr.upload_was
 => nil 
1.9.2-p320 :004 > wr.upload = "Yes"
 => "Yes" 
1.9.2-p320 :005 > wr.upload_was
 => nil 

に比べ:

1.9.2-p320 :006 > wr.assigned_to_staff
 => [] 
1.9.2-p320 :007 > wr.assigned_to_staff_was
 => [] 
1.9.2-p320 :008 > wr.assigned_to_staff << User.last.name
  User Load (0.2ms)  SELECT `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
 => ["last5, first5"] 
1.9.2-p320 :009 > wr.assigned_to_staff_was
 => ["last5, first5"] 

誰でもこの不一致を説明したり、回避策を提案したりできますか?

4

1 に答える 1

1

シリアライゼーションは、ホスト クラスのすべてのメソッドを完全には実装していないようです。getter と setter にはオーバーライドが提供されますが、連結は提供されません。

于 2013-07-19T20:16:19.957 に答える