-1

特定の状況下で、私たちが抱えている問題を解決しようと試みました。属性または関係を不変にする必要がある場合があります。つまり、属性が書き込まれると、永久に書き込まれます。attr_readonly関係にはうまくいかないので、適切ではなかったので、ここで概念を証明しようとしました:

http://pastie.org/562329

これは私のテスト、実装例を示しています (理想的にはモジュールに移動します) -- これがリレーションシップ セッターをオーバーロードする許容される方法であるかどうかはわかりません。テストを拡張してhttp://pastieを読むようにしました。 .org/562417これはやり過ぎかもしれませんが、customer_id が関係に対する属性としての顧客とどのように関係しているかを理解するのに役立ちましたが、訂正していただければ幸いです。

4

2 に答える 2

4

update_attribute(:customer_id => 1)試したことはありませんが、壊れてしまう場合もあると思います。また、属性セッターをオーバーライドするというアイデアは本当に好きではありません。

より良い(IMHO)アプローチは、「before_update」をオーバーライドし、何かが変更された場合はそれを無視することです。ダーティモジュールを使用してそれを行うことができます。これをチェックしてください:

私はこれをテストしていませんが、次のような行になります。

class Order < ActiveRecord::Base
  IMMUTABLE = %w{customer_id notes}

  before_save do |record|
    return false if IMMUTABLE.any? { |attr| record.changed.has_key?(attr) }
  end
end

もちろん、IMMUTABLEの処理方法についてはより良いアイデアがあります。これをモジュールに入れる場合、before_saveはModule#includedフックにある必要があります

于 2009-07-29T06:08:56.317 に答える
-2

最初の書き込みの後、メソッド自体が no-op として再定義されるように、setter メソッドを定義できます。

class Order < ActiveRecord::Base
  def customer= c
    if c
      super
      class << self
        def customer= c
        end
      end
    end
  end
end
于 2009-07-29T03:53:40.147 に答える