我有用户模型,我想为所有用户记录添加唯一的字符串键。列名应该是 unsubscribe_key。
迁移用户记录前:
id = 1
username = "text"
id = 2
username = "abc"
迁移用户记录后:
id = 1
username = "text"
unsubscribe_key = "5HQdTSsNRY6YCodmzr"
id = 2
username = "abc"
unsubscribe_key = "Jlewfw0324Lwp0sefr"
我有用户模型,我想为所有用户记录添加唯一的字符串键。列名应该是 unsubscribe_key。
迁移用户记录前:
id = 1
username = "text"
id = 2
username = "abc"
迁移用户记录后:
id = 1
username = "text"
unsubscribe_key = "5HQdTSsNRY6YCodmzr"
id = 2
username = "abc"
unsubscribe_key = "Jlewfw0324Lwp0sefr"
好吧,最简单的部分是添加新列。在外壳上:
rails generate migration AddUnsubscribeKeyToUsers unsubscribe_key:string
rake db:migrate
此外,您还需要在您的用户模型中使这个新属性可访问:
attr_accessible :unsubscribe_key #along with all your other accessible attributes
接下来,您需要添加唯一键。您可以为此编写一些 SQL 代码,或者创建一个可以在 rails 控制台中运行的 ruby 脚本。
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
现在回到 shell 并输入rails console. 在红宝石命令行上:
>>require "add_unique_keys.rb"
=> true
>>AddUniqueKeys.addUnsubscribeKeysToAllUsers
=> #Should print out array of users
如果一切顺利,你的新列应该用随机字符串填充。
尝试
$ rails g migration AddUnsubscribe_keyToUsers unsubscribe_key:string
然后
$ rake db:migrate
这是解决方案。
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
在 Rails 4.0 中使用简单的方法添加单列或多列.. https://gist.github.com/pyk/8569812