鉴于此定义(在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'
答案 0 :(得分:0)
我的猜测是,reset实际上是AssociationProxy对象的一个方法,而不是Array,这就是你得到未定义方法的原因。 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中的任何工具是否有用。
答案 1 :(得分:0)
使用调试器。 ruby-debug
一直工作到Ruby 1.9; byebug
适用于Ruby 2.0。
在正在破解的调用之前写一个带有调试器断点的脚本:
f = Food.last
rf = f.recipe_foods
byebug # or debug
rf.reset
然后执行脚本。调试器将在调用之前中断,然后您可以进入调试器以找出实际执行的代码。