2011-01-28 164 views
1

我目前正在編寫一個ruby函數,它從數據庫獲取一個表,然後根據數據創建一個數組。它是這樣寫的:在Ruby on Rails中添加數組

def listSome 
    @foos = Array.new 
    FooTable.find(:all) do |foo| 
     @foos << foo if foo.name == "Bar" 
    end 
    end 

我遇到的問題是隻有查詢的第一個元素被添加到數組中。我已經檢查過FooTable.find(:all)會返回我認爲它應該在控制檯中的內容,並且可以循環使用它的結果(我在每個循環中打印結果,它找到了它所要查找的內容)。不過,我懷疑,有一些關於我不明白的數組/集合的連接。爲什麼我只將查詢的第一個結果添加到數組中?謝謝。

回答

8

您正在爲find方法提供一個塊,該方法不會針對它返回的數組的每個元素運行它。請將您的區塊提供給find返回的each方法。

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

而且,假設這是實際的代碼,而不是一個例子,有越來越FOOS具有特定名稱的一個非常糟糕的方式。

梁2

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

軌道3

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

+1我刪除類似的答案,但沒有提到他的發現效率低下。我更喜歡這個。 – jdl 2011-01-28 17:29:11

+0

Jeez你說得對,我現在就看到它。此外,這會不會是一種有效/較好/較差的方法? @foos = FooTable.find_all_by_name(「Bar」)? – keybored 2011-01-28 17:35:08

0

你忘了eachFooTable.find(:all).each do |foo|

但我會做一些更多的評論,你應該使用更map/select/reject/injecteach

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

但只要有可能,使用更多的SQL和更少的紅寶石:

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