将列替换为具有相同名称的其他内容,但请继续填充它

时间:2016-11-04 16:00:49

标签: ruby-on-rails ruby activerecord

我正在更新系统以使其具有更规范化的数据库架构。目前,我们有一个builds表,其中user列将用户名存储为文本。我想添加user_id列和users表,并让some_build.user返回用户模型。到目前为止非常简单。

不幸的是,对这个代码库的测试并不像你希望的那么彻底。如果我们必须回滚更改,我想继续填充旧的user列。我尝试将其放在build.rb

alias_attribute :legacy_username, :user
before_save do
  if changed_attributes.keys.include? 'user_id'
    legacy_username = user.name
  end
end

我希望它会写入user列,同时让Build#user指向User模型。不幸的是,legacy_username最终使user方法别名,而不是user列 - 即some_build.legacy_username返回User,而before_save挂钩不是成功的。

有没有办法在保留所有名为user的内容的同时协调这一点,或者我是否需要重命名?

1 个答案:

答案 0 :(得分:0)

啊哈!事实证明,您可以使用ActiveRecord::Base#[]=直接设置数据库值:

before_save do
  if changed-attributes.keys.include? 'user_id'
    self[:user] = username
  end
end

不需要别名。