你好,我想知道如何正确定义默认值?
class SetDefault < ActiveRecord::Migration
def change
change_column :table_name, :column_name, :type, default: "Your value"
end
end
但不是“您的值”,而是存储在@settings模型中的@yourvalue
class SetDefault < ActiveRecord::Migration
def change
change_column :table_name, :column_name, :type, default: @settings.yourvalue
end
end
class CreateSettings < ActiveRecord::Migration[5.2]
def change
create_table
t.string :yourvalue
t.timestamps
end
end
end
@您的值将由用户定义和更新
答案 0 :(得分:1)
迁移是普通的Ruby类。您可以在其中编写Rails代码。例如。您可以访问您的模型。
class SetDefault < ActiveRecord::Migration
def change
change_column :table_name, :column_name, :string, default: Setting.find(1).yourvalue
end
end
用您需要过滤的逻辑替换Setting.find(1)
。
答案 1 :(得分:1)
我将在模型上进行设置,这样您的迁移就不会依赖于其中数据的先前状态。
class TableName < ApplicationRecord
before_create :add_defaults
# whatever
private
def add_defaults
self.column_name = Setting.find(1).default_value unless column_name
end
end
通过这种方式,您将不会从迁移中调用ActiveRecord,并且如果您将其部署在某个地方并在添加Setting
记录之前运行迁移,则您的应用仍然可以运行。在添加任何数据之前,您可能需要一个完全迁移的数据库。