我正在使用 Rails 和 MySql 数据库以及 Devise 进行用户注册。我在两个数据库中有一个用户表,例如:db1 和 db2。注册用户后,我检查了 Rails 在后台,为两个数据库创建了用户。当我查看 db1 的用户表时,没有找到记录,但为 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
最佳答案
您的方法存在一些问题:
最重要的一点:通过这种方式编写 SQL 语句,您很容易受到 SQL 注入(inject)攻击。参见 this site了解更多信息。请尽量避免构建自己的 SQL,并尽可能使用 ActiveRecord 的辅助方法。
其次,您正在与错误的连接通话。每个请求都有一个数据库连接。通过调用 ActiveRecord::Base.establish_connection("db_second")
,您将该连接更改为与“db2”的连接。这意味着之后,所有操作都将使用该连接而不是与“db1”的连接。
这两个问题的可能解决方案是引入具有不同连接的第二个模型。
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
但是,如果您使用它进行备份,可能有更好的工具。如果备份是您想要的,您可能需要查找“热备份”解决方案。
关于mysql - 用户记录保存到一个数据库但不在另一个数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24087300/