1

Rails2.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デフォルトでは-optionofhas_manyがに設定されているため、これは発生しないはずですtrue。これは、object_idsの変更が原因で発生します

4

1 に答える 1

0

新しいコンテキスト (リクエスト/レスポンス) ごとに、オブジェクト ID が再生成されます。クエリを実行a.prices.first.object_idすると、毎回最初の価格を取得するためにクエリがヒットし、ヒットするたびに新しいオブジェクト ID が生成されます。

しかし、2 番目のケースでは、最初の価格をインスタンス変数に抽出し、それに取り組んでいるため、新しい要求/応答がデータベースに送信されないため、同じオブジェクト ID が与えられます。

于 2012-09-27T12:06:10.863 に答える