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 没有身份映射”(或者至少,它没有启用)。如果你这样做

an_order_template.user.order_template

然后user.order_template导致OrderTemplate第二次从数据库中加载,因此您有两个不同的内存对象表示同一数据库行。第二个副本不会在内存中进行任何更改(包括您的实例变量)。

你可以通过这样做来解决这个问题

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 知道两个订单模板是同一个对象。

于 2012-07-30T18:28:15.483 回答