rails:2303
From: Yoichiro Tanaka <yoichiro@e...>
Date: Tue, 31 Jul 2007 18:05:13 +0900
Subject: [rails:2303] Re: ActiveRecordオブジェクトの属性にクエスチョンをつけると・・・?
よういちろう です。 On 2007/07/31, at 17:15, 山崎雄介 wrote: > ActiveRecordオブジェクトの属性の語尾に?をつけて呼ぶと > true/falseが返って > くることに最近気づきました。 > > person = Person.find(1) > > person.name => "Yamasaki" > person.name? => true <snip /> > これは person.attribute.blank? と同じと考えてよいので > しょうか? > 振る舞いを見るとそのように見えるのですが、どこで実装されている > か見つから > ないもので、確証がないもので。 初心者ながら,コードを追ってみました。activerecord-1.15.3/lib/ active_record/base.rb ファイルの, def method_missing → def define_read_methods → def define_question_method という呼び出しが行われて,define_question_methodsメソッド の中で,#{attr_name}?,つまり上記の name? が定義され ることになります。で,メソッドの処理は,やはり base.rb ファイルの中で定義されている query_attribute メソッドの呼 び出しです。つまり, def name? query_attribute('name') end というメソッドが呼び出されることになります。では, query_attribute メソッドはどうなっているかというと, def query_attribute(attr_name) attribute = @attributes[attr_name] if attribute.kind_of?(Fixnum) && attribute == 0 false elsif attribute.kind_of?(String) && attribute == "0" false elsif attribute.kind_of?(String) && attribute.empty? false elsif attribute.nil? false elsif attribute == false false elsif attribute == "f" false elsif attribute == "false" false else true end end という感じになっていました。属性値が "0" なときも false が返ってくるあたりは,blank? メソッドの挙動とは違っ ているかと思います。 RoR 歴1ヶ月なもので正確さを欠いていたら申し訳ありません。 ご参考になれば幸いです。ではでは。 --- Yoichiro Tanaka mail-to: yoichiro@e... blog: http://www.eisbahn.jp/yoichiro/ -- ML: rails@r... 使い方: http://QuickML.com/
2302 2007-07-31 10:15 [y-yamasaki@s... ] ActiveRecordオブジェクトの属性にクエスチョンをつけると・・・? -> 2303 2007-07-31 11:05 ┗[yoichiro@e... ] 2304 2007-07-31 17:02 ┗[y-yamasaki@s... ]