2012-08-06 23 views
0

是普遍的問題:Rails的2.3:所以在這裏更換紀錄協會,而不是刪除

我有3個表,爲簡單起見,我們會打電話給他們的A,B,C


ID

表b
ID
A_ID
C_ID

表c
id

因此,b中的記錄將a和c的記錄關聯起來。

而問題: 當用戶提交表單時,會提交一些散列數,每個散列表示b中需要填充的記錄。現在,我只是刪除和重新添加,如果數據庫中存在更多關聯(D)而不是已提交(S),我希望能夠迭代現有關聯和(以及這裏變得棘手的地方),然後刪除DS條目,如果DS相同,則僅替換當前條目,如果DS爲負數,則添加SD記錄。

然後將它們全部更新爲新關聯。

我試着做一個循環,但問題是活動記錄查詢返回一個數組,我仍然有一個哈希來迭代。由於我不能讓兩個數組循環同步,所以我不知道該從哪裏開始。有任何想法嗎?

注意:我可以發佈實際的代碼,但是處理這個的控制器函數非常長。


編輯:我覺得我在這裏不夠具體,雖然我越來越確信這一切都必須手動這裏是我正在尋找的一個粗略的例子。

submitted_hash[:whatever].each do |key,value| 
    #value.first_submit 
    #value.second_submit 
end 

ModelName.find(:all, :conditions => ["fk_ref = ?", params[:fk_ref]]).each do |model_value| 
end 

現在,如果「ModelName.find」返回不止是目前在「submitted_hash」,那麼我們就需要創造更多的參考資料,以滿足用戶的需求。

如果「ModelName.find」返回的值小於「submitted_hash」,那麼我們將在數據庫中添加作爲行的差異。

如果他們是平等的,不需要採取行動 - 在這部分 - 這是必需的。

最後,我需要使用ModelName.find(:all,:conditions),它現在應該返回與我們散列中相同的數量(我已經得到了這個)。 [:subbmited_hash]

現在不知何故,我通過我們ModelName.find和PARAMS需要循環的同時,使記錄1得到由提交1代替,然後記錄2提交2等

注:所以我可以得到我的意圖,我試圖做的是更換沒有任何刪除不必要的記錄,如果有人提交6並需要3,我的代碼現在將刪除6,並添加3新的。這可以工作,但每次更新時它會永久刪除6行(在這種情況下)。我希望它刪除3(兩個值的差異),並將剩餘的3更新爲新提交的值。

回答

1

您的文本對我來說不是很清楚,但最接近的是您可以查找的是mysql 替換命令。

它插入一個新行,如果沒有相應的,否則它會更新。

像這樣:

REPLACE INTO b (id, a_id, c_id) VALUES (5, 2, 3); 

裁判:http://dev.mysql.com/doc/refman/5.0/en/replace.html

但是它不會刪除舊的無效項。我認爲你需要爲自己/手動做。數據庫不以這種方式工作。

可以用ORM框架來做到這一點。我不知道什麼鐵軌,但也許這個頁面可以幫助你:

http://blog.gridworlds.com/rails/delete-or-delete-removing-things-in-rails

或者嘗試尋找軌「刪除孤兒」