1

Rails 3.2、Ruby 1.9.3、および ThinkingSphinx (最新バージョン) を使用しています。

このコードは Ruby 1.8.7 / Rails 2.3 では問題なく動作しましたが、上記にアップグレードしたため動作しません。

ads = Ad.search "ipod"

ads.respond_to?(:total_entries)

puts ads.total_entries #outputs 472

具体的には

ads.respond_to?(:total_entries)

false を返しますが、ads オブジェクトでこのメソッドを呼び出すと、正常に動作します/期待どおりに動作します。

ここで何が起こっているのか誰にもわかりますか?

4

2 に答える 2

2

これは、動的メソッドまたはゴースト メソッドである可能性があります

ads.respond_to?(:total_entries) # => false
ads.total_entries
ads.respond_to?(:total_entries) # => true

つまり、どこか (おそらくmethod_missing) で次のtotal_entriesように動的に作成されたことを意味します。

define_method :total_entries do 
  #do some stuff here
end

または場合

ads.respond_to?(:total_entries) # => false
ads.total_entries
ads.respond_to?(:total_entries) # => false

次にmethod_missing、メソッド名をパラメーターとして処理し、必要なことを行いました。

于 2013-06-06T00:58:02.770 に答える
1

putsメソッドが存在するads.total_entriesという意味でなくても動作します。total_entries

存在しないメソッドを呼び出すと、Ruby はその呼び出しmethod_missingを処理できるハンドラーを呼び出します。

正確な理由を見つけるには、Ad.search返されるクラスの定義を提供してください。

于 2013-06-06T00:39:53.090 に答える