2011-01-28 16 views
1

私は現在、データベースからテーブルを取得し、そのデータに基づいて配列を作成するruby関数を書いています。Ruby on Railsの配列に追加する

問題は、クエリの最初の要素だけが配列に追加されていることです。私は、FooTable.find(:all)がコンソールですべきと思うものを返し、結果をループすることもOKであることを確認しました(すべてのループに結果を表示し、探していたものが見つかりました)。しかし、私が理解していない配列/コレクションへの連結について何かがあると私は思っています。なぜ私はクエリの最初の結果を配列に追加するだけですか?ありがとう。

答えて

8

findメソッドには、返される配列の各要素に対してブロックを実行しないブロックを用意しています。 findによって返されたeachメソッドにブロックを提供します。

FooTable.find(:all).each { |foo| ... } 

また、これは実際のコードであり、例ではないと仮定すると、特定の名前のfoosを取得することは本当に悪い方法です。 FooTable.find(:all).each do |foo|

レール2

@foos = FooTable.find(:all, :conditions => ['name = ?', 'Bar']) 

レール

@foos = FooTable.where('name = ?', 'Bar') 
+0

+1を私が削除しました同様の答えですが、彼の発見の非効率性は言及していませんでした。私はこの方が良いと思う。 – jdl

+0

あなたは正しいと思うよ今私はそれを見る。また、これは多かれ少なかれ有効/より良い/悪いアプローチですか? @foos = FooTable.find_all_by_name( "Bar")? – keybored

+0

find_all_by_nameを使用すると、完全に良い方法になります。それは条件付きの検索を行うのとまったく同じになる動的ヘルパーです。 –

0

3あなたはeachを忘れてしまいました。

しかし、私はいくつかのより多くのコメントを作ると思います、あなたはeachmap/select/reject/injectより少ないを使用する必要があります。

def listSome 
    @foos = FooTable.find(:all).select do |foo| 
    foo.name == "Bar" 
    end 
end 

しかし、可能な限り、より多くのSQL少ないRubyの使用:

def listSome 
    @foos = FooTable.where(:name => "Bar") 
end 
+0

なぜ 'select'の代わりに' map'と 'compact'を使うのですか? – Samuel

+0

@Samuel、確かに、私は地図を表示したかったが、ここでは選択が良い。 – tokland

関連する問題