ActiveRecord回调 - 如何根据刚保存的记录创建新记录?

时间:2010-08-04 07:56:59

标签: ruby-on-rails activerecord callback

我需要帮助我认为应该是ActiveRecord回调。

我想要实现的是,每次保存特定记录时,ActiveRecord实际上会在同一个表中保存2条记录。

我会远离我想要的原因,应该知道每个事务需要在同一个表中保存2个单独但相似的记录。

示例:

0)我有一个名为“链接”的表格,用于存储与其他人相关联的人。它看起来像这样:

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

1)网络应用程序用户将进入发起人和接收人(发起或接收链接)。此时“person_id”为空白:

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

2)在记录保存之前,我需要将“origin_person”的值复制到“person_id列:

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

3)最后,保存记录后,我需要保存重复记录,但将“rcvd_person”值复制到“person_id”:

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

这正是我想要做的,所以如果你能帮助我了解如何实现这一目标,那将是值得赞赏的。

我宁愿把所有这些都放在Rails视图中,因为我不想隐藏字段和什么不闲逛。

我试图解决这个问题时遇到的一个问题是它会循环。我写了一些代码(不起作用),一旦保存记录就会创建一条新记录,但是每次保存都会触发一条新记录,这是一个新的保存....

1 个答案:

答案 0 :(得分:1)

您可以在模型中添加一个标记,该标记可用于防止行重复。这样,当您创建一个新条目时,它会被调用after_ * callback并在其中创建一个新对象并设置复制标志以防止进一步复制。

有些事情:

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

(当然这段代码没有经过测试,我只想说明如何完成)

话虽这么说,我真的会想到为什么以及我是否需要这种行为。在我看来,如果你需要它可能会出现其他问题。