我有以下迁移:
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的行,如果没有,我想插入一些默认值。
如何在迁移中执行此操作?
答案 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指出我正确的方向,但没有包括方法。