如果数据不存在,则在迁移中插入数据

时间:2013-08-08 05:31:05

标签: ruby-on-rails ruby migration

我有以下迁移:

Sequel.migration do
  up do
    create_table :user_settings do
      primary_key :id

      String :signature, null: true, text: true
    end

    alter_table :user_settings do
      add_foreign_key :user_id, :users, null: false, on_delete: :cascade

      add_index :user_id
    end
  end

  down do
    drop_table :user_settings
  end
end

这将添加默认用户设置。

我遇到的问题是,在迁移之前,我想在user_settings表中为当前在数据库中没有行的每个用户创建一行。

我想检查每个用户是否在数据库中有一个匹配user_id的行,如果没有,我想插入一些默认值。

如何在迁移中执行此操作?

2 个答案:

答案 0 :(得分:1)

通常,这种事情是使用rake任务完成的,但在迁移中需要。我猜你已经在User和UserSetting模型中添加了关联,它将是has_one关联。您需要创建一个新的迁移文件

def up
  users = User.includes([:user_setting]).where(:user_setting => {:user_id => nil})
  users.each do |user|
    user.create_user_setting
    # OR you can write
    # UserSetting.create({:user_id => user.id, :signature => 'your-custom-text'})
  end
end

答案 1 :(得分:0)

我最终得到了这个:

Sequel.migration do
  up do
    existing_settings = SequelAdapter::UserSettings.select(:user_id).to_a

    SequelAdapter::User.exclude(id: existing_settings).each do |user|
      SequelAdapter::UserSettings.create({user_id:  user.id})
    end
  end
end

感谢@bachan Smruty指出我正确的方向,但没有包括方法。