2011-03-28 55 views
9

ActiveRecord find_or_create_by動態查找方法允許我指定一個塊。這個文檔並不清楚,但它似乎只在創建案例中運行,而不是在查找案例中運行。換句話說,如果找到記錄,塊不會運行。我用這個控制檯代碼對它進行了測試:Rails find_or_create_by其中block在find case中運行?

User.find_or_create_by_name("An Existing Name") do |u| 
    puts "I'M IN THE BLOCK" 
end 

(沒有打印任何內容)。這兩種情況下有沒有辦法讓這個區塊運行?

回答

20

據我瞭解,如果沒有發現塊,塊將被執行。它的用例是這樣的:

User.find_or_create_by_name("Pedro") do |u| 
    u.money = 0 
    u.country = "Mexico" 
    puts "User is created" 
end 

如果用戶沒有找到會初始化新的用戶名稱爲「佩德羅」,所有這些東西里面塊,並返回新創建的用戶。如果用戶存在,則只會返回該用戶而不執行該塊。

您也可以使用 「塊式」 其他的方法,如:

User.create do |u| 
    u.name = "Pedro" 
    u.money = 1000 
end 

它會做同樣的User.create(:name => "Pedro", :money => 1000)但看起來更好一點

User.find(19) do |u| 
    .. 
end 

+0

這是一個救星,謝謝。 – 2011-04-14 01:29:38

9

在我看來,這個問題實際上並沒有回答,所以我會這樣做。這是最簡單的方式,我認爲,你可以做到這一點:

User.find_or_create_by_name("An Existing Name or Non Existing Name").tap do |u| 
    puts "I'M IN THE BLOCK REGARDLESS OF THE NAME'S EXISTENCE" 
end 

乾杯!

+0

你已經使用過'tap',它會返回'find_or ...'的結果,所以實際上並沒有將塊傳遞給find,而是點擊! – 2016-06-22 13:32:38

+0

請注意,如果您的表格有一個非空約束,並且您正在搜索的字段不滿足,則調用tap將會引發ActiveRecord :: StatementInvalid – 2017-01-19 22:43:06