【问题标题】:How to set another column with the value of the primary key on create如何在创建时使用主键的值设置另一列
【发布时间】:2016-09-01 14:59:47
【问题描述】:

创建记录时,我想将名为original_id 的列设置为其主键的值(在本例中为id)。本质上,这些行将变成层次结构,它们看起来像这样:

| id | original_id |
| -- | ----------- |
|  1 |           1 |
|  2 |           1 |
|  3 |           1 |
| .. |           1 |
| 42 |          42 |
| 43 |          42 |

模型将如下所示:

class AccountTransaction < ApplicationRecord
  belongs_to :original,
             class_name: 'AccountTransaction',
             foreign_key: :original_id
end

创建记录然后像这样更新很容易:

record = AccountTransaction.create
record.update(original: record)

但我正在寻找一种更优雅的解决方案,一种不需要两个数据库事务的解决方案。感谢您的帮助。

【问题讨论】:

    标签: ruby-on-rails ruby postgresql activerecord


    【解决方案1】:

    您可以使用after_create 回调来做一些事情。

    class AccountTransaction < ApplicationRecord
    
      after_create :upate_original_id
    
      def update_original_id
        update_attribute(original_id: id)
      end
    
    end
    

    【讨论】:

    • 感谢您的意见,但很遗憾这不是我想要的。我想在单个数据库事务中完成。您上面的代码几乎是我已经拥有的,我正在寻找一种优化它的方法。
    • 从开发者的角度来看是一个单一的数据库事务。他只是编码AccountTransaction.create 并且original_id 已经被填充。开发人员不需要做任何特别的事情来确保发生这种情况。这就是 ActiveRecord 回调的重点。
    猜你喜欢
    • 1970-01-01
    • 2020-12-21
    • 2021-12-03
    • 1970-01-01
    • 2022-01-05
    • 2014-03-26
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    相关资源
    最近更新 更多