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