5

この移行を生の SQL に変換するにはどうすればよいですか? または変換できますか?

class AddUnsubscribeTokenToUsers < ActiveRecord::Migration
  def self.up
    add_column :users, :unsubscribe_token, :string, :unique => true
    User.all.each do |user|
        user.unsubscribe_token = ActiveSupport::SecureRandom.hex(18)
    end
  end
  def self.down
    remove_column :users, :unsubscribe_token
  end
end
4

2 に答える 2

3

私の知る限り、単一の移行を SQL に変換することはできませんが、Ruby の代わりに SQL で ActiveRecord にスキーマを出力させることができます。

# in config/application.rb

config.active_record.schema_format = :sql

これにより、Ruby DSL の代わりに db/schema に SQL 出力が表示されます。ただし、どちらの形式にも、ユーザー トークンを設定するコードのスニペットは含まれません。

また、移行にそのような DB 変更コードを含めることは悪い考えと見なされます。たとえば、モデルを削除したり名前を変更したりするとどうなるか、その移行を実行すると失敗します。少なくともモデルのチェックでラップします。または開始/レスキュー/終了

if defined? User
  User.all.each do |user|
    user.unsubscribe_token = ActiveSupport::SecureRandom.hex(18)
  end
end

また

begin
  User.all.each do |user|
    user.unsubscribe_token = ActiveSupport::SecureRandom.hex(18)
  end
rescue
end

update_attributesそして最後に、トークンを設定した後にモデルを保存しないため、使用または呼び出しのいずれかであるため、そのスニペットは意図したことを実行しませんuser.save

于 2013-02-16T22:16:41.227 に答える
2

カスタム レーキ タスクを使用してこれを実現する方法を説明している、非常に優れた記事を偶然見つけました。

于 2015-02-06T13:48:06.550 に答える