Sql 在Rails活动记录迁移中添加一列,初始值基于其他列

Sql 在Rails活动记录迁移中添加一列,初始值基于其他列,sql,ruby-on-rails,activerecord,rails-activerecord,rails-migrations,Sql,Ruby On Rails,Activerecord,Rails Activerecord,Rails Migrations,我正在尝试使用Rails中的活动记录迁移将列添加到现有表中。我需要该列的初始值基于表中的其他列。在活动记录迁移中有没有办法做到这一点 为了让它更具体,假设我有以下几点: my_table ---------------- first_name: text last_name: text 我想添加一个初始值为concat(first\u name',last\u name')的full\u name文本列。请注意,我不希望在该列上设置默认值,因为我希望应用程序继续填充该列(初始默认值只是为现有记

我正在尝试使用Rails中的活动记录迁移将列添加到现有表中。我需要该列的初始值基于表中的其他列。在活动记录迁移中有没有办法做到这一点

为了让它更具体,假设我有以下几点:

my_table
----------------
first_name: text
last_name: text
我想添加一个初始值为
concat(first\u name',last\u name'
)的
full\u name
文本列。请注意,我不希望在该列上设置默认值,因为我希望应用程序继续填充该列(初始默认值只是为现有记录设置一个合理的起始值)

在迁移中如何做到这一点?理想情况下,我希望使用
add\u column
或类似的方法,但如果这样做不起作用,则可以使用一种可行的替代方法


请注意,已经存在一个几乎相同的问题(),但其答案似乎都不能完全回答此问题。

您可以在
添加列
之后使用
更新所有
。对于MySQL:

Person.update_all('full_name = concat(first_name, " ", last_name)')

您可以在
add\u column
之后使用
update\u all
。对于MySQL:

Person.update_all('full_name = concat(first_name, " ", last_name)')

最后,我使用
add_column
添加了列,然后使用direct SQL更新列的值。我使用了direct SQL而不是model per,因为它不依赖于模型的当前状态与基于正在运行的迁移的表的当前状态

class AddFullName < ActiveRecord::Migration
  def up
    add_column :my_table, :full_name, :text
    execute "update my_table set full_name = concat(first_name, ' ', last_name)"
  end

  def down
    remove_column :my_table, :full_name
  end
end
class AddFullName

也就是说,如果有更好或更惯用的方法,我洗耳恭听。

我最终使用
add\u column
添加列,然后使用direct SQL更新列的值。我使用direct SQL而不是model per,因为它不依赖于模型的当前状态与选项卡的当前状态le基于正在运行的迁移

class AddFullName < ActiveRecord::Migration
  def up
    add_column :my_table, :full_name, :text
    execute "update my_table set full_name = concat(first_name, ' ', last_name)"
  end

  def down
    remove_column :my_table, :full_name
  end
end
class AddFullName

也就是说,如果有更好或更惯用的方法来解决这个问题,我会洗耳恭听。

我的方法不管用吗?@DanilSperansky确实管用,但它可能会受到问题的影响(在另一个答案中指出)当模型在迁移过程中超过该点时,这就是为什么我将SQL解决方案发布到更新中。因为它不会尝试实例化活动记录对象,所以我能想到的唯一一个可能失败的情况是,如果迁移之后重命名或删除表。我的方法不起作用吗?@DanilSperansky确实如此,尽管它可能会受到问题的影响(在另一个答案中指出)当模型在迁移过程中超过该点时,这就是我向更新发布SQL解决方案的原因。由于它不尝试实例化活动记录对象,所以我能想到的唯一一个失败的情况是,如果迁移之后重命名或删除表。根据我对问题的评论,我t如果随后的迁移删除或重命名了此表,我会认为这将失败,因为具有该名称的活动记录对象将不再存在,无法调用
update\u all
。换句话说,它不完全是未来可靠的。根据我对问题本身的评论,我会认为如果随后的迁移删除或重命名,这将失败重命名此表,因为具有该名称的活动记录对象将不再存在,无法调用
update\u all
打开。换句话说,它不是完全可靠的。