Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 通过覆盖Getter/Setter在Rails迁移中保留数据_Ruby On Rails_Rails Migrations - Fatal编程技术网

Ruby on rails 通过覆盖Getter/Setter在Rails迁移中保留数据

Ruby on rails 通过覆盖Getter/Setter在Rails迁移中保留数据,ruby-on-rails,rails-migrations,Ruby On Rails,Rails Migrations,我正在做一个迁移,我需要一个更改列的数据类型,另一个保留该列中的数据,即,将其转换为新的数据类型,并将其保留在同一列中。新的列类型要求我重写getter和setter,这会导致迁移失败 有一个用户表,其中包含用户连接的IP地址字段:IP_addr。这当前是一个字符串,我想将其更改为整数。迁移的up方法如下所示: def up add_column :users, :curip, :integer User.reset_column_information User.all.each

我正在做一个迁移,我需要一个更改列的数据类型,另一个保留该列中的数据,即,将其转换为新的数据类型,并将其保留在同一列中。新的列类型要求我重写getter和setter,这会导致迁移失败

有一个用户表,其中包含用户连接的IP地址字段:IP_addr。这当前是一个字符串,我想将其更改为整数。迁移的up方法如下所示:

def up
  add_column :users, :curip, :integer
  User.reset_column_information
  User.all.each do |u|
    u.update_attribute :curip, User.ip_str_to_int(u.ip_addr)
  end
  remove_column :users, :ip_addr
  rename_column :users, :curip, :ip_addr
end
def ip_addr
  val = read_attribute(:ip_addr)
  User.ip_int_to_str(val)
end

def ip_addr=(val)
  write_attribute(:ip_addr, User.ip_str_to_int(val))
end
User.ip_str_to_int进行数学运算,将ip地址四元组转换为整数

我还有一些方法可以覆盖ip_addr调用User.ip_str_to_int的getter和setter,以及相应的User.ip_int to_str方法。这些方法如下所示:

def up
  add_column :users, :curip, :integer
  User.reset_column_information
  User.all.each do |u|
    u.update_attribute :curip, User.ip_str_to_int(u.ip_addr)
  end
  remove_column :users, :ip_addr
  rename_column :users, :curip, :ip_addr
end
def ip_addr
  val = read_attribute(:ip_addr)
  User.ip_int_to_str(val)
end

def ip_addr=(val)
  write_attribute(:ip_addr, User.ip_str_to_int(val))
end
到现在为止,你可能已经猜到了问题所在。当迁移运行时,它会阻塞,因为被重写的getter/setter期望列包含一个整数,但在迁移发生时,该列实际上包含一个字符串。我分别测试了迁移和getter/setter方法,它们都很好。对于我自己的开发环境,我可以简单地注释掉运行迁移的getter/setter,然后将它们放回。但这是一个混乱,不适用于生产

有什么建议吗?我知道,如果我不尝试保持相同的列名,我就不会有这个问题,但是更改列名意味着更改其他代码


环境:sqlite 3;Ruby 2.1.4;Rails 3.2.13.

您可以修改getter方法来处理数据为字符串的情况

def ip_addr
  val = read_attribute(:ip_addr)
  return val if val.is_a? String
  User.ip_int_to_str(val)
end