2012-08-09 62 views
0

一般來說,在使用ActiveRecord時總是應該檢查返回值save使用ActiveRecord時,應該總是檢查「save」的返回值嗎?

例如,我已經遇到了一些這樣的代碼:

def foo(active_record_instance) 
    active_record_instance.field_1 = 'a' 
    active_record_instance.field_2 = 'b' 
    # ...15 more lines... 
    active_record_instance.save # <== 
    baz = bar(active_record_instance.id) 
    # ...15 more lines that use baz... 
    baz 
end 

def bar(id) 
    instance = ActiveRecordSubclass.find(id) 
    instance.field_3 = instance.field_1 + instance.field_2 
    instance 
end 

這是稍微經過設計的,但它是我工作的代碼庫一個相當現實的例子。 (這不是這種模式的一個孤立情況。)

鑑於ActiveRecordSubclass的驗證在不斷變化,並且在不久的將來(甚至一年之後)可能發生變化,我認爲返回值應該檢查active_record_instance.save。另一種方法是使用active_record_instance.save!

是否適合檢查記錄是否保存?或者說是foo方法微觀的東西,不應該關注,因爲目前的驗證不會失敗?

回答

1

真正的答案是,'你關心的問題的數據?`

如果你關心的數據,那麼,你應該返回一些虛假或拋出一個異常,並以某種方式溝通爲什麼它未通過驗證。

如果你真的不關心,如果它保存,它會在10秒,此時你期望它的工作受審,則忽略該項錯誤。

由於個人喜好和經驗,我寧願有一些失敗的快速和戲劇性的是,不是花幾個小時或幾天追捕一個錯誤,因爲一些50級之前,實際上並沒有保存。

2

也許你可以使用保存!方法,捕捉異常並將你的邏輯放在裏面。

begin 
    foo.save! 
rescue ActiveRecord::RecordInvalid 
    # handle logic here 
end 
+0

澄清:我的問題是更多關於是否異常或檢查返回值是否應* *完成。我的一位同事說忽略記錄是否保存。 – 2012-08-09 22:26:29

相關問題