如何在rails迁移中为关联(外键)添加默认值?

时间:2018-03-09 00:30:30

标签: ruby-on-rails rails-migrations

我有一个我想要添加到客户端的覆盖计划。新客户应默认使用具有密钥1的临时覆盖计划。

使用Rails 5.0,我知道如何将默认值添加到常规列,但如何将默认值添加到一对一关联?我是否需要指定对象或仅指定键的值?

3 个答案:

答案 0 :(得分:1)

在我看来,最好不要在迁移中硬编码foreign_key值。

您可以执行以下操作,而不是在迁移中设置默认值:

before_create :set_default_plan

def set_default_plan
  plan = Plan.find_by(name: 'default plan name')
  self.plan = plan if plan.present?
end

答案 1 :(得分:0)

运行rails generate

之后
rails g migration AddCoverageToClients coverage:reference

并在子coverages表中创建数据,将外键的值指定为默认值。

class AddCoverageToClients < ActiveRecord::Migration[5.0]
  def change
    add_reference :clients, :coverage, foreign_key: true, null: false, default: 1
  end 
end

答案 2 :(得分:0)

您应该按照@Ravi Teja Dandu的建议在模型中设置未来数据的默认值

但是,在添加引用时,您可以使用这种迁移方式,通过三步过程使您可以使用外键设置非空引用

  1. 使用外键设置引用,但允许为空
  2. 手动为每个项目设置一个值
  3. 将引用更改为不允许null
class AddCategoryToMenuItems < ActiveRecord::Migration[5.2]

   def change
        add_reference :menu_items, :drink_category, foreign_key: true, index: true, null: true

        reversible do |change|
            change.up do
                first_category = DrinkCategory.first
                MenuItem.find_each do |item|
                    item.drink_category = first_category
                    item.save
                end

            end
        end

        change_column_null :menu_items, :drink_category_id, false
    end
end