Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ActiveRecord回调-如何基于刚刚保存的记录创建新记录?_Ruby On Rails_Activerecord_Callback - Fatal编程技术网

Ruby on rails ActiveRecord回调-如何基于刚刚保存的记录创建新记录?

Ruby on rails ActiveRecord回调-如何基于刚刚保存的记录创建新记录?,ruby-on-rails,activerecord,callback,Ruby On Rails,Activerecord,Callback,我需要关于我认为应该是ActiveRecord回调的帮助 我试图实现的是,每次保存一条特定记录时,ActiveRecord实际上会在同一个表中保存两条记录 我不想解释我为什么要这样做,应该知道每个事务都需要在同一个表中保存两个独立但相似的记录 例如: 0)我有一个名为“链接”的表,用于存储链接到其他人的人。看起来是这样的: +----+-----------+---------------+-------------+ | id | person_id | origin_person | rcv

我需要关于我认为应该是ActiveRecord回调的帮助

我试图实现的是,每次保存一条特定记录时,ActiveRecord实际上会在同一个表中保存两条记录

我不想解释我为什么要这样做,应该知道每个事务都需要在同一个表中保存两个独立但相似的记录

例如:

0)我有一个名为“链接”的表,用于存储链接到其他人的人。看起来是这样的:

+----+-----------+---------------+-------------+
| id | person_id | origin_person | rcvd_person |
+----+-----------+---------------+-------------+
1) web应用程序用户将输入发起人和接收方(发起或接收链接的人)。此时,“人员id”为空:

+----+-----------+---------------+-------------+
| id | person_id | origin_person | rcvd_person |
+----+-----------+---------------+-------------+
| 1  |           | 5             | 10          |
+----+-----------+---------------+-------------+
2) 在记录保存之前,我需要将“来源\人员”的值复制到“人员\ id”列:

+----+-----------+---------------+-------------+
| id | person_id | origin_person | rcvd_person |
+----+-----------+---------------+-------------+
| 1  | 5         | 5             | 10          |
+----+-----------+---------------+-------------+
3) 最后,保存记录后,我需要保存一条重复记录,但将“rcvd_person”值复制到“person_id”:

这正是我想做的,所以如果你能帮我一个如何实现这一点的想法,我将不胜感激

我宁愿将所有这些都排除在Rails视图之外,因为我不希望隐藏字段和其他不存在的内容


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

您可以在模型中添加一个标志,用于防止行重复。这样,当您创建一个新条目时,它会在调用回调后保存,并在其中创建一个新对象并设置重复离子标志,以防止进一步的重复

大致如下:

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
(当然,这段代码没有经过测试,我只是想说明如何进行测试)


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

你可以在模型中添加一个标志,用于防止行重复。这样,当你创建一个新条目时,它会在调用*callback后保存,并在其中创建一个新的object并设置复制标志以防止进一步复制

大致如下:

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
(当然,这段代码没有经过测试,我只是想说明如何进行测试)


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

谢谢Slobodan。我想要这种行为的原因是为了获得我想要的记录,我需要使用自定义sql find,这意味着我会破坏我已经拥有的很多东西ke paginate等等。我可能必须咬紧牙关,让我的Rails以正确的设计工作。但感谢您澄清了如何做到这一点。感谢Slobodan。我想要这种行为的原因是,为了获得我想要的记录,我需要使用自定义sql find,这意味着我将破坏我已经做过的很多事情我可能不得不咬紧牙关,让我的导轨设计合理。但谢谢你澄清了如何做到这一点。