2016-07-22 85 views
0

我有一个配方数据库,当创建一个新配方时,我想创建它的两个版本(不能编辑的原始版本)和另一个可编辑的版本。这样用户可以将当前版本与原始版本进行比较。在rails中创建时创建两个版本的记录

我有两个字段,将它们联系起来,并确定他们(is_original:布尔和original_id:整数)

我无法弄清楚在何处放置代码都进行参数调整和两次创造的配方。我想创建第一个is_original设置为true和original_id。然后,我需要从刚刚创建的配方中获取id,并在下一个配置中设置original_id以匹配。

+0

我知道这不是你要求的,但你会考虑使用像“审计”宝石?我们用它来追踪记录中的历史变化,在这种情况下,原始的“快照”将成为第一个“审计”。把它丢去外面。 – Tass

回答

1

使用after_create回调。

此外,为什么还要打扰is_original字段,如果您只能为original_id设置null值。只是做一个is_original?方法,查看original_id字段,如果为null,则返回true。

+0

因为我在创建数据库结构时起床晚了,并没有考虑到这个问题,所以会在我的结构中进行调整。所以对于rails来说很陌生并且无法找出在回调方法中放置什么以获得第二个创建的 – DRing

+0

在原始回调中使用self,而使用new创建YourClass.new以创建新记录。手动转移道具或创建一个克隆(new_record = old_record.dup) – pixelearth

+0

好吧,所以当测试它以更改属性时,我得到了after_create方法...但是我无法获得它来创建新记录,这是我尝试过的: new_recipe = self.dup new_recipe.original_id = self.id new_recipe.save – DRing

0

首先创建原件。创建完成后,如果已编辑 - 创建可编辑版本。所有的编辑都可以创建原创的孩子,并且基本的版本控制系统将会到位。

不要一次创建两个对象 - 第二个只是第一个的副本。这似乎没有必要,特别是如果它从未编辑。

我同意@pixelearth的布尔值。使用parent_id或original_id。