首页 > 解决方案 > 添加列的自定义默认值

问题描述

我正在创建一个迁移,在其中向模型添加一列。由于模型中已经有对象,我想给它们一个默认值。但是不同对象的含义会根据链接模型中另一个对象的状态而有所不同。

class Message < ApplicationRecord
 belongs_to :user
end

class User < ApplicationRecord
 has_many :messages
end

class AddColumnMessageSendType < ActiveRecord::Migration[5.1]
  def change
    add_column :mesasges, :send_type, :string, default: ???
  end
end

可以在新迁移each do之后 使用或在新迁移中添加def change并执行。但我想知道你是否可以使用这个。谢谢update(send_type: custom_value)ifdefault:

标签: ruby-on-railsmigrationdefault-value

解决方案


我会创建一个回调来处理这个新记录,并为已经存在的记录合并一个 rake 任务。

应用程序/模型/message.rb:

class Message < ApplicationRecord
  belongs_to :user

  before_create :set_send_type

  def set_send_type
    if something
      send_type = 'a'
    else
      send_type = 'b'
    end
  end
end

每次创建新消息时都会运行上述内容。这里有很多关于回调的内容。

然后在 rake 任务(lib/tasks/set_send_types.rake)中:

rake set_send_types: :environment do
  Message.all.each do |message|
    message.set_send_type
    message.save
  end
end

您需要message.save在 rake 任务中调用 ,因为set_send_type此示例中的实际并未保存到数据库本身。它依赖于运行回调后发生的保存。

您应该只需要运行一次 rake 任务。


推荐阅读