[前][次][番号順一覧][スレッド一覧]

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...     ]