我正在使用Rails和MySql数据库和Devise进行用户注册。我在两个数据库中有一个用户表,例如:db1和db2。注册用户后,我检查了Rails是否在后台,在那里为两个数据库创建了用户。当我查看db1的users表时,没有找到记录但是为db2插入了记录。
这是我的代码。谢谢你的帮助。
user model
-----------
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :confirmable
attr_accessible :username, :email, :password, :password_confirmation, :remember_me, :confirmation_token
after_create :save_to_db2
def save_to_db2
@user = User.last
ActiveRecord::Base.establish_connection("db_second").connection
sql = "INSERT INTO users (username, email) VALUES ('#{@user.username}', '#{@user.email}')"
connection.execute(sql)
end
end
database.yml
-------------
development:
adapter: mysql2
encoding: utf8
database: db1
pool: 5
username: root
password: root
db_second:
adapter: mysql2
encoding: utf8
database: db2
pool: 5
username: root
password: root
答案 0 :(得分:2)
您的方法存在一些问题:
最重要的一点:通过这种方式制作SQL语句,您很容易被SQL注入。有关详细信息,请参阅this site。请尽量避免构建自己的SQL并尽可能使用ActiveRecord的帮助方法。
其次,你正在谈论错误的联系。每个请求都有一个数据库连接。通过调用ActiveRecord::Base.establish_connection("db_second")
,您将一个连接更改为与#34; db2&#34;的连接。这意味着在此之后,所有操作都将使用该连接而不是与&#34; db1&#34;的连接。
这两个问题的可能解决方案是引入具有不同连接的第二个模型。
class BackupUser < ActiveRecord::Base
def self.establish_connection
super(:db_second)
end
establish_connection
end
然后在原始用户中:
class User < ActiveRecord::Base
# ....
after_create :make_backup
def make_backup
BackupUser.create!(username: username, email: email)
end
end
但是,如果您使用它进行备份,那么可能有更好的工具。如果备份是你想要的,你可能想要查找&#34;热备份&#34;的解决方案。