Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 通过联接模型调用时虚拟属性不包含值?_Ruby On Rails_Ruby_Activerecord_Attributes - Fatal编程技术网

Ruby on rails 通过联接模型调用时虚拟属性不包含值?

Ruby 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

也许是新手问题,也许不是,也许我缺少OOT,但我仍然无法回答为什么我无法获得实例变量@upgrade的值,该变量被分配为true

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