1

premium_frompostgres テーブルに datetime 列を設定 する rails migration を書いています。

人口に問題はありませんが、datetime 属性を に戻そうとすると、rails または postgres のいずれかが何もしていないように見えるため、移行のためのロールバック メソッドの作成に行き詰まっていますnil。有用なエラー メッセージも出力できなかったので、何が起こっているのかまったくわかりません。

これが私の最新の反復です(他に何も機能しないように見えるため、必死になってアカウントを個別に操作してみました):

def self.down
  Account.where('premium_from is not null').each do |a| 
    a.update_attribute(:premium_from, 'null')
  end
end

これは陽気に約 7 秒間実行され、入力されたすべてのpremium_fromエントリがそのまま残り、Google でも有用なものを見つけることができません。

nilpostgres でdatetime 列のエントリを設定する方法を知っている人はいますか?

それとも、明らかなことを見落としているだけですか?

編集:アップはこのようになります

csv.each do |row|
  if account = Account.premium.find_by_name(row.first)
    # This .find is necessary because .premium uses a join, meaning that it returns
    # read-only objects
    Account.find(account.id).update_attribute(:premium_from, Time.parse(row.last))
  end
end
4

2 に答える 2

2

まず第一に、移行自体でクラスAccountを定義していない限り、移行内のクラスを参照することは避けます。将来、クラスをAccountリファクタリングして別の名前にする可能性があるため、これは常に賢明な方法であり、その場合、この移行は実行されません。Accountすべきことのようなものclass Account < ActiveRecord::Base; end

邪魔にならないので、この場合は SQL のみを使用することをお勧めします。それは十分に単純であり、はるかに優れたパフォーマンスを発揮します。更新を発行するためだけに、これらすべてのレコードを取り込み、AR オブジェクトを構築する必要はありません。これが私がそれを行う方法です:

execute "UPDATE accounts SET premium_from = NULL where premium_from IS NOT NULL;"
于 2012-07-31T15:47:26.397 に答える
0

試しましたか :

a.update_attribute(:premium_from, nil)

あなたの列はpostgresでnull値を許可していますか?

于 2012-07-31T15:37:54.313 に答える