2011-05-30 21 views
7

我現在開始學習Ruby和Ruby on Rails框架。我發現,在表records,我能找到一個紀錄的5的ID,並通過使用下面的代碼刪除:爲什麼我不能在Rails中使用Record.all.destroy?

Record.find(5).destroy

這也在情理之中我鏈的方法來查找記錄和摧毀它。但是,如果我要摧毀表中的所有記錄,邏輯命令將以下,爲all選擇器選擇表中的所有記錄:

Record.all.destroy

而這個返回NoMethodError!我知道我可以使用Record.destroy_allRecord.delete_all來完成此任務,但是,我想知道爲什麼我不能使用最合理的選擇,而不必查找像delete_all這樣的東西。我是這個框架的新手,所以我完全有可能在這裏錯過了一些基本的東西。

感謝您提前提供任何答案。

+0

確實是一個很好的問題,因爲我先嚐試了同樣的事情......您可以使用Record.all.each {| r | r.destroy}'當然,但這不像'Record.all.destroy' – 2011-05-30 16:12:27

回答

14

這是一個設計決定。 DataMapper花費了your approach。被迫明確地寫destroy_all可能是乏味的,但也會阻止你做一些你真正不想要的東西(即刪除表中的所有內容,如x = User; ...; x.destroy)。

+0

謝謝 - 這是我正在尋找的答案。我想這可能是防止意外大量刪除記錄的良好保護。 – element119 2011-05-30 16:26:35

3

我同意它會邏輯能夠做到這一點。從技術上講,Record.all返回一個集合(或代理集合),它不執行destroy方法。

1

當你有

Record.find(5) 

這將返回一個記錄對象/實例代表在表中的一行數據。然後你調用由Record模型定義的對象的#destroy方法。

當你有

Record.all 

這個返回數組對象。爲了讓你在數組上調用#destroy,你必須修補Ruby的核心Array類來使用#destroy方法。

+0

yes and no ...因爲ruby的動態特性,rails本身*可以*在數組記錄中插入一個destroy動作,而不用猴子修補所有數組對象......但是這是一個設計決定,不是我想的。 – DGM 2011-05-30 18:07:40

1

避免Record.destroy_all最簡單的方法是Record.all.each {|r| r.destroy}。這可能會在某種程度上滿足您的API設計偏好,但應該比第一個選項慢得多。

0

其實你可以(以某種方式)。由於.all返回一個數組,而不是一個活動的記錄關係,你究竟會刪除什麼?我不會說Record.all.destroy是合乎邏輯的 - 你在刪除數組對象嗎?

你可以做的一件事是映射結果數組,因爲map接受一個proc(&),你可以爲你的數組中的每個對象執行該proc。

Record.all.map(&:destroy) 

注意,這將觸發所有對象的回調,這可能比你預期的要慢。如果你想避免觸發回調,你可以映射適當的破壞性方法而不是銷燬。(提示:刪除)

或者,你可以只是做:

Record.destroy_all or Record.delete_all 

,你在你的問題說明。

相關問題