2010-08-04 88 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

相关问题