タイトルはbindingですが、直接的に組み込み関数のbindingやBindingクラスの事ではありません。関係はありますが。
最近、書いているAmazon ECSを検索して、ごにょごにょする処理で、ECSのResponseの中(ResponseGroup=Mediumには含まれている)にBindingという項目があります。本の種類(親書、単行本、文庫)などが取得できます。
そこで、ECSの情報をキャッシュするテーブルEcsBookというクラスを作って、binding項目もそのままbindingという項目名としました。
class CreateEcsBooks < ActiveRecord::Migration
def self.up
create_table :ecs_books do |t|
t.column :asin, :string
...
t.column :binding, :string
...
そうすると、DBからこのテーブルのレコードを読んでくる際
TypeError (wrong argument type String (expected Proc/Binding)):
Y:/usr/local/InstantRails/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/callbacks.rb:335:in `eval'
...
こんなエラーが発生するようになった。
実は、このエラーがこの項目bindingのせいだと気づいたのは、何時間も悩んだあげく、Ruby on Rails: beware of reflection errors [<blink> Tech notes for the greater good]というページをググって見つけたから。
英語は不得意なもので、正確には分らないですが、evalやbindingとかBugとか言っている。
これはActiveRecordがbindingというカラム名を誤認識して、リフレクションがおかしくなるのでは?と気づきました。
項目名bindingをecs_bindingに変えてみたところ見事、問題解決。
しかし分りにくいな。