我正在更新系统以使其具有更规范化的数据库架构。目前,我们有一个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
的内容的同时协调这一点,或者我是否需要重命名?
答案 0 :(得分:0)
啊哈!事实证明,您可以使用ActiveRecord::Base#[]=
直接设置数据库值:
before_save do
if changed-attributes.keys.include? 'user_id'
self[:user] = username
end
end
不需要别名。