2016-11-04 3 views
0

より正規化されたデータベーススキーマを使用するようにシステムを更新しています。現在、テーブルには、ユーザ名をテキストとして格納するuserカラムがあります。 user_id列とusers表を追加し、some_build.userのユーザーモデルを返すようにします。今のところかなり簡単です。列を同じ名前の別のものに置き換えますが、そのままにしておきます。

残念ながら、このコードベースのテストは、あなたが望むよりも徹底的ではありません。変更を元に戻す必要がある場合は、古いuserの列に値を設定してください。私はbuild.rbでこれを入れてみました:Build#userUserモデルに向けたまま、私は、それがuser欄に書くでしょう期待していた

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

。残念ながらlegacy_usernameは、user列ではなくuserメソッドのエイリアスを終了します。つまり、some_build.legacy_usernameUserを返し、before_saveフックが成功しません。

userと呼ばれるものをすべて維持しながらこれを行うことはできますか、名前を変更する必要はありますか?

答えて

0

アハ!あなたが直接ActiveRecord::Base#[]=を使用してデータベースの値を設定することができ判明:

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

必要はありません別名。

関連する問題