2010-08-04 87 views
1

我需要幫助,我認爲應該是一個ActiveRecord回調。ActiveRecord回調 - 如何根據剛剛保存的記錄創建新記錄?

我想要實現的是,每次保存某個記錄時,ActiveRecord實際上會在同一個表中保存2條記錄。

我會遠離爲什麼我想要這個,它應該足以知道每個事務需要2個獨立但相似的記錄保存在同一個表中。

例子:

0)我有一個表稱爲「鏈接」,將店裏的人與其他人。它看起來像這樣:

+----+-----------+---------------+-------------+ 
| id | person_id | origin_person | rcvd_person | 
+----+-----------+---------------+-------------+ 

1)Web應用程序的用戶將在始發者和接收人(誰是始發或接收的鏈接)進入。在這一點上 「爲person_id」 空白:

+----+-----------+---------------+-------------+ 
| id | person_id | origin_person | rcvd_person | 
+----+-----------+---------------+-------------+ 
| 1 |   | 5    | 10   | 
+----+-----------+---------------+-------------+ 

2)記錄保存之前,我需要複製到「爲person_id列 「origin_person」 的價值:

+----+-----------+---------------+-------------+ 
| id | person_id | origin_person | rcvd_person | 
+----+-----------+---------------+-------------+ 
| 1 | 5   | 5    | 10   | 
+----+-----------+---------------+-------------+ 

3)最後,一旦記錄已被保存,我需要保存一個重複的記錄,但複製到「爲person_id」中的「rcvd_person」值:

+----+-----------+---------------+-------------+ 
| id | person_id | origin_person | rcvd_person | 
+----+-----------+---------------+-------------+ 
| 1 | 5   | 5    | 10   | 
+----+-----------+---------------+-------------+ 
| 2 | 10  | 5    | 10   | 
+----+-----------+---------------+-------------+ 

這正是我想要做的,所以如果你可以幫我一個想到如何實現這一點,將不勝感激。

我寧願將所有這些都排除在Rails視圖之外,因爲我不想要隱藏的字段以及什麼不在附近。

我試圖解決這個問題時遇到的一個問題是它會循環。我寫了一些代碼(這是行不通的),一旦記錄被保存就會創建一個新記錄,但每次保存都會觸發一個新記錄,這是一個新的保存...

回答

1

您可以添加一個標誌到可以用來防止行重複的模型。這樣,當你創建一個新的條目時,它將被保存,並在其中創建一個新的對象並設置複製標誌以防止進一步的重複。

東西線沿線的:

def Link 
    after_create :duplicate_link 
    attr_accessible :stop_duplication 

    private 
    def duplicate_link 
    unless stop_duplication 
     new_link = Link.new 
     # set all the link attrs here 
     new_link.stop_duplication = true 
     new_link.save 
    end 
    end 
end 

(當然這個代碼是沒有經過測試,我只是想說明它是如何做)

話雖這麼說,我真的覺得很難爲什麼以及如果我需要這種類型的行爲。在我看來,如果你需要這個,別的東西可能是錯的。

+0

謝謝斯洛博丹。我想要這種行爲的原因是,爲了獲得我想要的記錄,我需要使用自定義sql查找,這意味着我會打破很多我已經擁有的分頁等等。我可能不得不咬緊牙關,讓我的Rails以合適的設計工作。但是,謝謝你清理如何做到這一點。 – Oscar 2010-08-04 08:47:24

相關問題