如何在续集中重新加载表模式?

ibl*_*lue 5 ruby sequel

鉴于我有以下迁移:

Sequel.migration do
  up do
    alter_table :users do
      add_column :is_admin, :default => false
    end

    # Sequel runs a DESCRIBE table statement, when the model is loaded.
    # At this point, it does not know that users have a is_admin flag.
    # So it fails.

    @user = User.find(:email => "admin@fancy-startup.example")
    @user.is_admin = true
    @user.save!
  end
end
Run Code Online (Sandbox Code Playgroud)

然后续集不会自动重新加载表结构(请参阅注释内联).

我正在使用这个丑陋的黑客来解决它:

# deep magic begins here. If you remove a single line, it will
# break the migration.

User.db.schema("users", :reload => true)
User.instance_variable_set(:@db_schema, nil)
User.columns
User.new.respond_to?(:is_admin=)
sleep 1
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

Phr*_*ogz 8

这个hack比你的hack简单得多:(重新)将数据集设置为表名:

User.set_dataset :users
Run Code Online (Sandbox Code Playgroud)

看到行动:

require 'sequel'
DB = Sequel.sqlite
DB.create_table :users do
  primary_key :id
  String :name
end

class User < Sequel::Model; end
User << { name:"Bob" }

DB.alter_table :users do
  add_column :is_admin, :boolean, default:false
end

p User.first       #=> #<User @values={:id=>1, :name=>"Bob", :is_admin=>false}>

p User.setter_methods    #=> ["name="]
User.set_dataset :users  # Make the magic happen
p User.setter_methods    #=> ["name=", "is_admin="]

@user = User.first
@user.is_admin = true
@user.save

p User.first       #=> #<User @values={:id=>1, :name=>"Bob", :is_admin=>true}>
Run Code Online (Sandbox Code Playgroud)

请注意,没有Sequel::Model#save!方法 ; 我改变它save以便它可以工作.