2011-11-07 13 views
0

空ではない列のカウント方法を教えてください。私は私のコントローラで

def sedomain 
country_codes = %w[ dk se com net org info ] 
@domains = { } 
country_codes.each do |cc| 
    @domains[cc.to_sym] = { :navn => ".#{cc}" } 
    end 
render :layout => 'page' 
end 

DK SE COMネットORG情報は、私のドメインのテーブルの列です。

は私が

私はこのような何かを試してみましたが、どのように多くのブランクでないというカウントする:

def sedomain 
country_codes = %w[ dk se com net org info ] 
@domains = { } 
country_codes.each do |cc| 
    @domains[cc.to_sym] = { :navn => ".#{cc}", :count => Domain.#{cc}.count } 
    end 
render :layout => 'page' 
end 

しかし、私はnomethodエラーが発生します。

+0

は、それはありますか? –

+0

それはドメインですか#{cc} .count –

+0

#はコメントを示しています。tadmanの答えは次のようになります:count => Domain.send(cc).count –

答えて

2
Domain.count(cc) 

または

Domain.count(cc, :conditions => ["`#{cc}` IN NOT NULL OR `#{cc}` != ''"]) 
+0

これは正常に動作しています。それはDomain.whereより優れていますか(: "#{cc.gsub( '。'、 '')}。not_eq => nil).count? –

7

これはかなり簡単なので、本当にRubyに関する本を入手する必要があります。 #{...}は、の文字列と文字列にのみ有効な補間器です。その特定のコンテキストの外では、#は通常コメントとして解釈され、残りの行は無効になります。適切なシンタックスハイライトエディタでこれが表示され、StackOverflowのコードハイライターでもこのように動作します。

のように、必要なのはsendです。 。。=>ドメイン#{CC} .countを数えるか::。=>ドメインを数える "#{CC}" カウント

+0

私は方法のエラーを受け取りません:未定義のメソッド 'dk ' #<クラス:0x753c258>。 count => Domain.where(: "#{cc.gsub( '。'、 '')}。not_eq => nil).countは動作します。 –

+0

'send'の使用は、ほとんどの場合、複雑な複雑さのコードムです。 – Eric

+0

これは機能的な解決策であり、正しく検証された入力ではうまく機能しますが、実装のクリーンアップを見たときに最初にリファクタリングするものの1つになるはずです。 1つのテスト可能なインターフェイスで検証と委任を処理するメソッドにラップすることは、優れたソリューションです。この場合、 '#{...} 'で意図されたもののリテラルな翻訳です。 – tadman

関連する問題