0

我有以下迁移:

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 的行,如果没有,我想插入一些默认值。

如何在迁移中做到这一点?

4

2 回答 2

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
于 2013-08-08T05:57:07.233 回答
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,他为我指明了正确的方向,但没有包含方法。

于 2013-08-08T14:55:01.550 回答