Ruby on rails 添加列的自定义默认值

Ruby on rails 添加列的自定义默认值,ruby-on-rails,migration,default-value,Ruby On Rails,Migration,Default Value,我正在创建一个迁移,在该迁移中,我向模型添加了一列。由于模型中已经有对象,我想给它们一个默认值。但不同对象的含义将因链接模型中另一个对象的状态而异 class Message < ApplicationRecord belongs_to :user end class User < ApplicationRecord has_many :messages end class AddColumnMessageSendType < ActiveRecord::Migrati

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

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
类消息

可以通过使用
if
或在新迁移中添加
def change
和do
update(发送类型:自定义值)
之后添加
每个do
。但是我想知道您是否可以使用
默认值:
来进行此操作。谢谢

我将创建一个回调来处理前进中的新记录,并为已经存在的记录合并一个rake任务

app/models/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任务中调用
消息.save
,因为本例中的
set\u send\u type
实际上并不保存到数据库本身。它依赖于运行回调后发生的保存


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

默认值按照它所说的执行,它是一个预定义的字符串,无法从中引用任何内容。
rake set_send_types: :environment do
  Message.all.each do |message|
    message.set_send_type
    message.save
  end
end