Ruby a==b返回true,a.attribute==b.attribute返回false;红宝石
我正在测试控制器的这一行:Ruby a==b返回true,a.attribute==b.attribute返回false;红宝石,ruby,ruby-on-rails-3,Ruby,Ruby On Rails 3,我正在测试控制器的这一行: @channel.update_attribute(:active, true) expect(channel.active).to be_true fails (my variable is named 'channel') expect(assigns[:channel].active).to be_true passes assigns[:channel] == channel => true assigns[:channel].active ==
@channel.update_attribute(:active, true)
expect(channel.active).to be_true fails (my variable is named 'channel')
expect(assigns[:channel].active).to be_true passes
assigns[:channel] == channel
=> true
assigns[:channel].active == channel.active
=> false
assigns[:channel].active == channel.reload.active
=> true
我不明白为什么比较运算符说赋值[:channel]==channel,但它们的“active”属性不同 我假设通道是ActiveRecord对象,它与执行以下操作相同:
channel1 = Channel.find(1)
channel2 = Channel.find(1)
所以channel1==channel2
,因为它们的标识相同。(它们都是通道,具有相同的id)
但是如果你更新其中一个,另一个就会过时
channel1.active = "different value"
channel1.save
channel1.active != channel2.active
执行channel2.reload
将立即从数据库中获取属性
channel1.active == channel2.active
我假设频道是ActiveRecord对象,它与执行以下操作相同:
channel1 = Channel.find(1)
channel2 = Channel.find(1)
所以channel1==channel2
,因为它们的标识相同。(它们都是通道,具有相同的id)
但是如果你更新其中一个,另一个就会过时
channel1.active = "different value"
channel1.save
channel1.active != channel2.active
执行channel2.reload
将立即从数据库中获取属性
channel1.active == channel2.active
因为ActiveRecord模型的相等性是基于它们的ID,而不是每个属性。所以这是同一个模型,它们的“活动”属性有不同的设置。这就是为什么它在重新加载后工作 我认为,如果您更改第一行,它可能会像您预期的那样工作:
@channel.update(活动:真)
因为ActiveRecord模型的相等性是基于它们的ID,而不是每个属性。所以这是同一个模型,它们的“活动”属性有不同的设置。这就是为什么它在重新加载后工作
我认为,如果您更改第一行,它可能会像您预期的那样工作:
@channel.update(活动:真)
我不确定您的具体情况到底发生了什么,但总体情况一点也不奇怪:
class Foo
attr_reader :bar
def initialize
@bar = Bar.new
end
def ==(*) true end
class Bar
def ==(*) false end
end
end
a = Foo.new
b = Foo.new
a == b
# => true
a.bar == b.bar
# => false
这只是面向对象封装的结果。由a
来决定它是否认为自己等于b
,由a.bar
来决定它是否认为自己等于b.bar
,并且没有什么强制要求两者必须一致
在您的情况下,似乎存在一些缓存一致性问题。您似乎有两个不同的对象,它们都表示相同的数据库记录,其中一个包含过时的数据。我不确定在您的特定情况下到底发生了什么,但总体情况一点也不奇怪:
class Foo
attr_reader :bar
def initialize
@bar = Bar.new
end
def ==(*) true end
class Bar
def ==(*) false end
end
end
a = Foo.new
b = Foo.new
a == b
# => true
a.bar == b.bar
# => false
这只是面向对象封装的结果。由a
来决定它是否认为自己等于b
,由a.bar
来决定它是否认为自己等于b.bar
,并且没有什么强制要求两者必须一致
在您的情况下,似乎存在一些缓存一致性问题。您似乎有两个不同的对象,它们都表示相同的数据库记录,其中一个对象有过时的数据。如果调用
频道。重新加载(最后一个表达式),则该操作似乎有效。这意味着channel
和@channel
是不同的对象。更新一条不会自动更新另一条,尽管它们可能引用数据库中的同一条记录。如果调用channel.reload
(最后一个表达式),则此操作似乎有效。这意味着channel
和@channel
是不同的对象。更新一个不会自动更新另一个,尽管它们可能引用了您数据库中的同一记录。我添加了对由Yi Wen发送给我的文档的引用我添加了对由Yi Wen发送给我的文档的引用