ruby-on-rails - 如何在Rails迁移中将其他列的值复制为新列的默认值?

标签 ruby-on-rails activerecord migration

我有一个带有列price的模型。我需要添加一个值为marked_price的new_column price作为默认值。我可以在迁移中写这个吗,或者做这件事的最好方法是什么?

就像是:

class AddMarkedPriceToMenuItems < ActiveRecord::Migration
  def change
    add_column :menu_items, :marked_price, :decimal, :default => :price
  end
end

最佳答案

不可以,数据库不允许您使用表列上的DEFAULT设置来执行此操作。

但是您可以使用ActiveRecord回调来实现

class MenuItem < ActiveRecord::Base
  before_create :set_market_price_default

  private

  def set_market_price_default
    self.market_price = self.price
  end
end


至于迁移本身,您可以手动更新market_price

def change
  add_column :menu_items, :marked_price, :decimal

  reversible do |dir|
    dir.up { MenuItem.update_all('marked_price = price') }
  end
end


请注意,您可能想要创建模型的副本,该副本位于迁移过程中的本地位置,以免将来出现不同步的情况。

关于ruby-on-rails - 如何在Rails迁移中将其他列的值复制为新列的默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41743231/

相关文章:

ruby-on-rails - Rails 5 ActiveRecord - 在使用方法之前检查是否有任何结果

ruby-on-rails - Scaffold Rails 3 View 中的外键下拉列表

ruby-on-rails - Rails ActiveRecord session 存储在 HTML5 SessionStorage 而不是 Cookie 中

ruby-on-rails - 在 Rails JSON 序列化中重命名模型关联属性?

sharepoint - 迁移到 SP 2013 后,Wiki 页面完全空白

ruby-on-rails - Angular $http 和 Rails 4 参数

android - 在不触发 InvalidAuthenticityToken 的情况下将图像从 Android 客户端发布到 Rails 服务器

ruby-on-rails - 如何更改 belongs_to 字段上的默认验证错误消息

java - 有没有办法在 RabbitMQ 队列、交换、绑定(bind)等上执行 "migration"操作?

migration - Apache Kafka 是 JMS 的另一个 API 吗?