2017-05-04 8 views
0

メソッドが存在する場合、メソッドを条件付きで呼び出す方法がありますか?存在スタイル可能な属性の試行メソッド

は現在やって:たとえば

count = if thing.respond_to?(:sometimes_available) 
    thing.sometimes_available 
else 
    thing.do_expensive_query_to_get_available 
end 

は時々私がコレクションを照会し、余分な属性

Thing.join(:authors) 
    .select('things.*, count(authors.id) as sometimes_available') 
    .group('things.id') 

を選択するような何かを行うに素晴らしいことだ:

thing.presence(:sometimes_available) || thing.expensive 

答えて

1

おそらくあなたが探している機能はpですあなたがそれを送信しているメソッドにオブジェクトが応答しない場合でも、ActiveSupport#try

tryは実際にはnilを返します。

としてあなたは、あなたのコードを再作成することもでき

thing.try(:sometimes_available) || thing.expensive 

シーンの下で、それはあなたが正しいように前の回答をマーキング

def try(*a, &b) 
    if a.empty? || respond_to?(a.first) 
    # omitted for simplicity 
    a.public_send(*a, &b) 
    end 
end 
+0

が、これは明らかにOPが求めているもののために働くときに、少なくともダウン投票の理由を取得するとよいでしょう;) –

+0

は、あなたがソースコードにリンクすることができますか?私の 'try'メソッドは違って見えます。 'respond_to? 'を使用せず、' def try(* a、&b) a.emptyなら実際にはエラーを投げますか? && block_given? 収入自己 else __send __(* a、&b) end end' –

+0

Oh sad。私のプロジェクトはrails3です。あなたの解決策はrails4に導入されました –

関連する問題