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に感謝しますが、includesメソッドはありません。

于 2013-08-08T14:55:01.550 に答える