web-dev-qa-db-fra.com

rails ajouter une colonne au modèle de l'utilisateur

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"
14
Johnny Cash

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:

app/models/user.rb

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.

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

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.

36
Austin Mullins

Essayer 

 $ Rails g migration AddUnsubscribe_keyToUsers unsubscribe_key:string

Ensuite

 $ rake db:migrate
5
Brian Petro

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
3
Johnny Cash

Dans Rails 4.0, ajoutez une ou plusieurs colonnes de manière simple .. https://Gist.github.com/pyk/8569812

0
Nikhil Thombare