14

ユーザー モデルがあり、すべてのユーザー レコードに一意の文字列キーを追加したいと考えています。列名は unsubscribe_key にする必要があります。

移行前のユーザー レコード:

id = 1
username = "text"

id = 2
username = "abc"

移行後のユーザー レコード:

id = 1
username = "text"
unsubscribe_key = "5HQdTSsNRY6YCodmzr"

id = 2
username = "abc"
unsubscribe_key = "Jlewfw0324Lwp0sefr"
4

4 に答える 4

36

簡単な部分は、新しい列を追加することです。シェル上:

rails generate migration AddUnsubscribeKeyToUsers unsubscribe_key:string
rake db:migrate

また、ユーザー モデルでこの新しい属性にアクセスできるようにする必要があります。

アプリ/モデル/user.rb

attr_accessible :unsubscribe_key #along with all your other accessible attributes

次に、一意のキーを追加する必要があります。そのための SQL コードを記述したり、Rails コンソール内で実行できる Ruby スクリプトを作成したりできます。

lib/add_unique_keys.rb

module AddUniqueKeys
  KeyGenCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
  extend self
  def addUnsubscribeKeysToAllUsers
     users = User.all
     users.each do |u|
        u.update_attributes(:unsubscribe_key => generateKey(18))
     end
  end

  def generateKey(keyLength)
     key = ""
     keyLength.times do 
       key += generateKeyCharacter
     end
     key
  end

  def generateKeyCharacter
     KeyGenCharacters[rand(KeyGenCharacters.length)-1]
  end
end

シェルに戻り、 と入力しrails consoleます。ruby コマンドラインで:

>>require "add_unique_keys.rb"
=> true
>>AddUniqueKeys.addUnsubscribeKeysToAllUsers
=> #Should print out array of users

すべてがうまくいけば、新しい列にランダムな文字列が入力されます。

于 2013-02-16T20:48:36.553 に答える
5

試す

 $ rails g migration AddUnsubscribe_keyToUsers unsubscribe_key:string

それで

 $ rake db:migrate
于 2013-02-16T20:21:36.827 に答える
3

それが解決策です。

class AddUnsubscribeTokenToUsers < ActiveRecord::Migration
  def self.up
    add_column :users, :unsubscribe_key, :string, :unique => true
        User.all.each do |user|
            user.unsubscribe_token = ActiveSupport::SecureRandom.hex(18)
        end
  end
  def self.down
    remove_column :users, :unsubscribe_key
  end
end
于 2013-02-16T20:38:51.043 に答える