2014-06-06 2 views
1

사용자 등록을 위해 Rails 및 MySql 데이터베이스와 Devise를 사용하고 있습니다. 두 개의 데이터베이스 (예 : db1 및 db2)에 users 테이블이 있습니다. 사용자를 등록한 후에 레일즈가 백그라운드에 있음을 확인 했으므로 두 데이터베이스 모두에 대해 사용자가 생성되었습니다. 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")을 호출하면 해당 연결이 "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 

그러나, 거기에 아마 더 나은 도구가 있습니다. 백업이 원하는 경우 "핫 백업"솔루션을 검색 할 수 있습니다.

관련 문제