Ruby on rails 通过联接模型调用时虚拟属性不包含值?
也许是新手问题,也许不是,也许我缺少OOT,但我仍然无法回答为什么我无法获得实例变量@upgrade的值,该变量被分配为trueRuby on rails 通过联接模型调用时虚拟属性不包含值?,ruby-on-rails,ruby,activerecord,attributes,Ruby On Rails,Ruby,Activerecord,Attributes,也许是新手问题,也许不是,也许我缺少OOT,但我仍然无法回答为什么我无法获得实例变量@upgrade的值,该变量被分配为true class OrderTemplate < ActiveRecord::Base belongs_to :user attr_writer :upgrade #to hold upgrade process across actions def upgrade @upgrade || false end
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
class OrderTemplate他们看起来一样
自我升级
------------------------>这是事实
p self.user.order\u template.inspect
------------------------>他们看起来一样
p self.user.order\u template.upgrade
------------------------>是假的,但我期待的是真的
self.user.have_time_奖金?
结束
结束
类用户是假的,但我期待的是真的
结束
结束
请揍我。短版本是“activerecord没有身份映射”(或者至少没有启用)。如果你这样做
an_order_template.user.order_template
然后,user.order\u 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
rails知道两个订单模板是同一个对象。如果要读写到:升级,为什么不使用attr\u accessor。写一个单独的读者对我来说没有意义。我也在玩这个,更改为attr_accessor无助于我回答您的问题:我单独编写了它,因为我需要默认值。要获得一个false值,您不需要编写getter方法,因为如果您不编写任何要升级的内容,那么它最终将返回false,因为在ruby nil中,false将求值为false。您在代码中的位置是将升级设置为true?您是否尝试创建OrderTemplate的实例?类似于ot=OrderTemplate.new,然后尝试分配ot.upgrade=true,然后检查用户模型是否正确?您是100%正确的,您的“解决方案”工作正常。我立刻读到:-),填补了我的空白。我们是否应该像上面写的那样称之为“变通方法”
an_order_template.user.order_template