Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.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 a==b返回true,a.attribute==b.attribute返回false;红宝石_Ruby_Ruby On Rails 3 - Fatal编程技术网

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发送给我的文档的引用