ruby – 如何在续集中重新加载表模式?
发布时间:2020-12-17 03:36:12 所属栏目:百科 来源:网络整理
导读:鉴于我有以下迁移: 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 fla
鉴于我有以下迁移:
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 然后续集不会自动重新加载表结构(请参阅注释内联). 我正在使用这个丑陋的黑客来解决它: # 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 有没有更好的办法? 解决方法
这个hack比你的hack简单得多:(重新)将数据集设置为表名:
User.set_dataset :users 看到行动: 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,:is_admin=>true}> 注意there is no (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |