J'ai un modèle d'utilisateur et je souhaite ajouter une clé de chaîne unique à tous les enregistrements d'utilisateur.
Avant la migration user record:
id = 1
username = "text"
id = 2
username = "abc"
Après la migration user record:
id = 1
username = "text"
unsubscribe_key = "5HQdTSsNRY6YCodmzr"
id = 2
username = "abc"
unsubscribe_key = "Jlewfw0324Lwp0sefr"
Eh bien, la partie facile consiste à ajouter la nouvelle colonne. Sur la coquille:
Rails generate migration AddUnsubscribeKeyToUsers unsubscribe_key:string
rake db:migrate
En outre, vous souhaiterez rendre ce nouvel attribut accessible dans votre modèle utilisateur:
attr_accessible :unsubscribe_key #along with all your other accessible attributes
Ensuite, vous devrez ajouter les clés uniques. Vous pouvez écrire du code SQL pour cela ou créer un script Ruby que vous pouvez exécuter dans la console Rails.
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
Retournez maintenant dans le shell et tapez Rails console
. Sur la ligne de commande Ruby:
>>require "add_unique_keys.rb"
=> true
>>AddUniqueKeys.addUnsubscribeKeysToAllUsers
=> #Should print out array of users
Si tout va bien, votre nouvelle colonne doit être remplie avec des chaînes aléatoires.
Essayer
$ Rails g migration AddUnsubscribe_keyToUsers unsubscribe_key:string
Ensuite
$ rake db:migrate
C'est la solution.
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
Dans Rails 4.0, ajoutez une ou plusieurs colonnes de manière simple .. https://Gist.github.com/pyk/8569812