【问题标题】:ActiveRecord Callback - How to create a new record based on record just saved?ActiveRecord 回调 - 如何根据刚刚保存的记录创建新记录?
【发布时间】:2010-08-04 07:56:59
【问题描述】:

我需要关于我认为应该是 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 视图之外,因为我不想要隐藏的字段和不闲逛的东西。

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

【问题讨论】:

    标签: ruby-on-rails activerecord callback


    【解决方案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
    

    (当然这段代码没有经过测试,我只是想说明它是怎么做的)

    话虽如此,我真的会认真思考为什么以及是否需要这种行为。在我看来,如果您需要这个,可能还有其他问题。

    【讨论】:

    • 谢谢斯洛博丹。我想要这种行为的原因是为了获得我想要的记录,我需要使用自定义 sql find,这意味着我会破坏很多我已经拥有的东西,比如分页等等。我可能不得不咬紧牙关,让我的 Rails 以正确的设计工作。但感谢您澄清如何做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 2017-07-04
    • 2011-07-31
    相关资源
    最近更新 更多