Rails默认为定义的值

时间:2018-11-21 22:43:32

标签: ruby-on-rails postgresql

你好,我想知道如何正确定义默认值?

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

@您的值将由用户定义和更新

2 个答案:

答案 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记录之前运行迁移,则您的应用仍然可以运行。在添加任何数据之前,您可能需要一个完全迁移的数据库。