0

初心者の問題かもしれませんが、そうでないかもしれませんが、OOT が不足しているのかもしれませんが、true に割り当てられたインスタンス変数 @upgrade の値を取得できない理由はまだわかりません。

class OrderTemplate < ActiveRecord::Base
    belongs_to :user

    attr_writer :upgrade #to hold upgrade process across actions

    def upgrade
        @upgrade || false
    end

    def from_time
        p self.inspect
        ------------------------> they looks same
        p self.upgrade
        ------------------------> is true as is supposed to be

        p self.user.order_template.inspect
        ------------------------> they looks same
        p self.user.order_template.upgrade
        ------------------------> is false but i am expecting true

        self.user.has_time_bonus?
    end
end

class User < ActiveRecord::Base
    has_one :order_template

    def has_time_bonus?
        p self.order_template.upgrade
        ------------------------> is false but i am expecting true
    end

end 

叩いてください。

4

1 に答える 1

1

短いバージョンは、「activerecordにはIDマップがありません」(または少なくとも有効になっていません)です。もしあなたがそうするなら

an_order_template.user.order_template

次にuser.order_template、 がOrderTemplateデータベースから 2 度目にロードされるため、同じデータベース行を表す 2 つの異なるメモリ オブジェクトが存在します。2 番目のコピーには、メモリ内のみの変更 (インスタンス変数を含む) はありません。

あなたはおそらくこれを回避することができます

class OrderTemplate < ActiveRecord::Base
  belongs_to :user, :inverse_of => :order_template
end

class User < ActiveRecord::Base
  has_one :order_template, :inverse_of => :user
end

この:inverse_ofオプションは、Active Record がドットを結合するのに役立ちます。

an_order_template.user.order_template

rails は、2 つの注文テンプレートが同じオブジェクトであることを認識しています。

于 2012-07-30T18:28:15.483 に答える