1

Rails 2.3.14 中发生了一些奇怪的事情。任何想法为什么会发生以下情况?

例子

假设我们有像这样的类

class Article < ActiveRecord::Base
   has_many :prices
end

class Price < ActiveRecord::Base
end

然后在irb会话中发生以下情况。

>> a = Article.first
=> #<Article id: 980190962>
>> a.prices.first.object_id
=> 97498070
>> a.prices.first.object_id
=> 97470500
>> a.prices.first.object_id
=> 97451010
>> a.valid?
=> true
>> a.prices.first.object_id
=> 97374790
>> a.prices.first.object_id
=> 97374790

所以起初object_id每次访问记录时都会发生变化(是的,它总是相同的)。稍后调用#valid?此行为后停止。相反,一切都很好。每次调用都会得到相同的对象。

为什么这很重要?

假设您将验证添加到Price

class Price < ActiveRecord::Base
  validates_presence_of :amount
end

然后你想改变一篇文章的价格。

>> a = Article.first
=> #<Article id: 980190962>
>> p = a.prices.first
=> #<Price id: 280438907, amount: 1.0, article_id: 980190962>
>> p.amount = nil # oops, accidentally we assigned nil
=> nil
>> p.valid?
=> false
>> a.valid?
=> true

那是什么?价格无效,但文章无效?这不应该发生,因为默认情况下:validate-optionhas_many设置为true. 这是因为不断变化object_id的 s

4

1 回答 1

0

每个新的上下文(请求/响应)都会重新生成对象 ID。当您运行查询a.prices.first.object_id时,它每次都会点击查询以获取第一个价格,并且每次点击都会生成新的对象 ID。

但是在第二种情况下,您已将第一个价格提取到实例变量中并对其进行处理,因此没有新的请求/响应将进入数据库,因此它提供了相同的对象 IDS。

于 2012-09-27T12:06:10.863 回答