2010-01-28 51 views
4

我正在做一個從MS Access到Rails應用程序的單向數據傳輸應用程序。我保持Rails應用程序的安靜,所以我告訴我的同事,Access應用程序需要跟蹤記錄是否已經發送到Rails應用程序,因爲Access應用程序需要Rails應用程序中該記錄的ID來做「更新」。他懷疑這是必要的,因爲,例如,如果Access通過Access應用的人員模型ID向Rails Person模型發送記錄,我們稱之爲AID,因此如果Rails應用「看到」傳入的「:name =>'John Doe',:aid => 123「,並且沒有發現這種Person模型的'AID'等於123,那麼Rails應該創建它,當它找到一個'AID'等於123的Person模型時,更新它。我告訴他,設計是寧靜的,保持兩個不同的電話(一個是帖子,一個是put)是一件好事。 'put'的那個需要該呼叫即將更新的記錄的ID。爲什麼寧靜的設計意味着區分創建和更新?

但他有一些好處,爲什麼我們區分創建和更新,但沒有將其合併到一個方法中,在該方法中檢查記錄是否已經存在可以確定它是創建還是更新?

謝謝!

+1

HTTP的PUT和POST方法並不意味着是創建和更新操作的類比。你可以在http://stackoverflow.com/questions/630453/put-vs-post-in-rest – Jonas 2010-05-07 13:06:35

+0

瞭解更多。謝謝喬納斯,我正在閱讀它。 – 2010-05-10 20:38:56

回答

0

雖然在許多情況下您可能不需要關心其差異,但創建和更新是根本不同的概念。

有很多情況下,如果因爲發現重複的id而導致Create失敗,那麼盲目地更新(並覆蓋)記錄會是致命的。

如果您的應用程序並非如此,並且以後也不會這樣做,我會說它可能實際上是合併創建和更新的好方法 - 或者也可以保留創建和更新方法,但提供一個3。這兩個都做到了。

+0

謝謝你在這裏幫助Leeeroy。事實上,我爲每個控制器創建了三個獨立的「access_create,access_update和access_destroy」,僅用於項目的這個數據傳輸階段。爲了讓我想到時間到了,我可以直接「拔掉」整個Access Bridge的東西而不會有任何後果。但是,我想可以,那麼有一個'融合'的方法來檢查是否存在,然後創建或更新。 我希望得到一個愚蠢的東西:RESTful軌控制器does not意味着只能有7個動作,對嗎? – 2010-01-29 00:11:59

2

我同意你的同事。最終,服務應該易於使用,併爲來電者做好工作。強制調用者記住是否需要創建或更新令人討厭。

我看到它,以便讓他知道是否調用創建或更新將意味着他會需要或者

  1. 跟蹤他是否叫 已經創建(這意味着你 無法刪除在Rails的記錄 應用,但不告訴他)
  2. 他需要 問Rails應用程序的 數據是否已經在系統中,並 然後調用相應的API。

兩個選項都很糟糕。

還有一件事要補充。這並不意味着你的服務必須總是首先檢查記錄是否已經存在。如果期望你的用法在一次操作中被嚴重傾斜(例如,更新經常發生,但插入很少),那麼「假設記錄在那裏並執行更新可能是有意義的,如果它失敗了,那麼記錄不是那裏,然後做一個插入「。

+0

謝謝你的回覆Mlathe。我認爲創造更多的平均數量。但是,這是比例,當我看數字時,我想我們談論的是創建記錄(創建1時),它通常在其「有用生命週期」中更新一次(即在它之前)(因此也是1更新,因此50/50) 我曾經想過要讓Access先發送一個create然後發送一個更新,然後使用validate_uniqueness_of:AID來抵禦多餘的創建,從而使創建失敗繼續進行下面的更新。儘管如此,這聽起來很駭人聽聞。 – 2010-01-29 00:12:49

+0

是的,它不是很好,但在你的服務中構建邏輯解耦了這兩個系統。因此,您可以更改數據,而不必擔心會破壞訪問應用程序。另一種看待它的方式是,如果訪問應用程序需要記住它已經發送了信息,那麼就像在Access數據庫中製作數據副本一樣(即讓它們保持同步非常重要)。正如你可能猜測,複製數據庫中的數據是一個真正的痛苦和不好的做法。 – mlathe 2010-01-29 00:25:04

+0

再次感謝您的洞察。對於我來說,知道我通過在Rails上完成所有骯髒的工作而保持Access App的基本上未被觸動的感覺,對於做出像這樣的決定是一個很好的指導。 – 2010-01-29 00:41:28

3

在以下關於POST與PUT:

http://www.elharo.com/blog/software-development/web-development/2005/12/08/post-vs-put/

在SQL類比,POST是帶有自動生成 主鍵的INSERT和PUT是一個INSERT,指定 的INSERT語句中的主鍵。

如果您的所有主鍵都是自動生成的,則差異可能無關緊要。對於那些希望客戶能夠選擇主鍵的人來說,區別在於,例如,如果它不僅僅是一個整數(可能是一個GUID或文本標識符)。

+1

感謝Lotus Notes,以便找到並返回到像這樣的舊帖子。 – 2011-07-22 03:03:12