2

この定義を考えると (Ruby 2.0.0-p195 で Rails 3.2.13 を使用)...

class Food < ActiveRecord::Base
    has_many :recipe_foods, foreign_key: :food_id

.reset は文書化されているとおりに機能していません (@loaded フラグをリセットすることになっていますが、代わりにデータベースを再クエリして結果を返しています)...

2.0.0-p195 :037 > f = Food.last
  Food Load (1.6ms) ...
 => #<Food ...

2.0.0-p195 :038 > f.recipe_foods
  RecipeFood Load (9.4ms) ...
 => [#<RecipeFood ...

2.0.0-p195 :039 > f.recipe_foods.reset
  RecipeFood Load (10.0ms) ...
 => [#<RecipeFood ...

他の宝石がメソッドを乗っ取ったのではないかと思いますが、これは.methodから得たものです...

2.0.0-p195 :040 > f.recipe_foods.method(:reset).source_location
NameError: undefined method `reset' for class `Array'

実際に実行されている .reset のバージョンを確認するにはどうすればよいですか?

アップデート:

存在しないメソッドを呼び出そうとすると、次のような混乱が生じます (これが謎の解決に役立つ場合):

2.0.0-p195 :052 > f.recipe_foods.snafu
NoMethodError: undefined method `snafu' for #<ActiveRecord::Relation:0x007fdaef6315b0>

2.0.0-p195 :053 > f.recipe_foods.method(:snafu)
NameError: undefined method `snafu' for class `Array'
4

2 に答える 2

0

私の推測では、reset は実際には Array ではなく AssociationProxy オブジェクトのメソッドであるため、未定義のメソッドを取得しています。Rails 4はこれについてより賢いようです:

> c = Company.first
> c.users.method(:find)
=> # <Method: ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_User(ActiveRecord::Associations::CollectionProxy)#find>
> c.users.method(:find).source_location
=> ["/Users/me/.rvm/gems/ruby-2.0.0-p195/gems/activerecord-4.0.0/lib/active_record/associations/collection_proxy.rb", 140]

ここでの最善の解決策はわかりませんが、pryのツールのいずれかが役立つかどうかを確認します。

于 2013-08-22T15:55:12.593 に答える