8

私がそれを使用する一般的な方法は

psql > ALTER TABLE transactions ALTER COLUMN date SET DEFAULT CURRENT_TIMESTAMP\g

それは正常に動作します。

私の RoR アプリでは、2 つの方法で移行を作成しようとしました。

1.

class TransactionsSetDefaultDateChange < ActiveRecord::Migration
  change_column :transactions, :date, :datetime, :null=>false, :default=>'CURRENT_TIMESTAMP'
end

2.

class TransactionsSetDefaultDateChange < ActiveRecord::Migration
 execute <<-SQL
    ALTER TABLE transactions ALTER COLUMN date SET DEFAULT CURRENT_TIMESTAMP
 SQL
end

どちらも失敗しました。理由はありますか?

PS このケースは移行 ("rake db:migrate") で機能しますが、"rake db:setup" では正しく適用されません (SQL ステートメントが失われます)。

class TransactionsSetDefaultDateChange < ActiveRecord::Migration
 def change
 execute <<-SQL
    ALTER TABLE transactions ALTER COLUMN date SET DEFAULT CURRENT_TIMESTAMP
 SQL
 end
end
4

4 に答える 4

13

Rails 5 以降の場合、これは機能するようになりました

... null: false, default: -> { 'NOW()' } ...

Postgresql Modifiers でこのようなものを生成します

not null default now()
于 2016-10-21T04:27:06.023 に答える
8

ここであなたの質問と回答が私を動かしました。Rails 4.2.4 と Postgres 9.3 では、次の移行コードが機能しました。

    create_table :goodies do |t|
      t.datetime :last_read_at, null: false
    end
    execute "ALTER TABLE goodies ALTER COLUMN last_read_at SET DEFAULT CURRENT_TIMESTAMP"

これにより、動作する SQL が生成されました。

    last_read_at timestamp without time zone NOT NULL DEFAULT now(),
于 2015-12-16T01:44:19.400 に答える
-7

これを達成するための正しい/クリーン/きちんとした方法は、この移行です:

class TransactionsSetDefaultDateChange < ActiveRecord::Migration
  change_column :transactions, :date, :datetime, :null=>false, :default=>'now()'
end

したがって、次のようになります。

  • 標準的な移行であり、IrreversibleMigration を発生させる特定の SQL コマンドはありません。
  • タイムゾーンを使用して現在のタイムスタンプを設定する標準的な postgresql の方法
  • アプリケーション レベルでのトリガー/フィルターは必要ありません。Transaction.new.date の出力を見てください。
  • mysql のような他の RDBMS で動作します
于 2013-10-08T17:51:32.963 に答える