加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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 Sequel::Model#save! method;我将其更改为保存以便它可以正常工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读