2010-06-14 2 views
2

다른 프로젝트에 외부 사용자 데이터베이스를 사용하고 있습니다.레일 프로젝트에서 두 개 이상의 데이터베이스 사용

이제 내 프로젝트에 School 모델이 있는데, has_many 사용자와 사용자에게 많은 학교가 있습니다.

class User < ActiveRecord::Base 
    establish_connection "#{RAILS_ENV}_tunnel" 
    has_many :memberships 
    has_many :schools, :through => :memberships 
end 

class School < ActiveRecord::Base 
    has_many :memberships 
    has_many :users, :through => :memberships 
end 

class Membership < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :school 
end 

그래서이 지금 어떤 문제 : (회원 테이블이 아닌 exernal 사용자 DB에, 내 프로젝트의 DB에 있기 때문에), 그러나

  • 내가 school.users를 호출 할 수 없습니다 나는 사용자가 호출 할 수 있습니다 .schools
  • 이렇게하면 읽기 전용으로 연결이 열리기 때문에 current_user.school.find (params [: id]). update_attributes (params [: school])와 같이 업데이트 할 수 없습니다. 나는이 문제를 해킹 할 수 방법을 이해

, 즉 I는 다음과 같이 호출 할 수 있습니다

school.users :

class School < ActiveRecord::Base 
    has_many :memberships 
    # has_many :users, :through => :memberships 

    def users 
    User.where("users.id in (?)", self.connections.map(&:user_id)) 
    end 
end 

그러나 이것은 해킹은 충분하지 않습니다. 이제는 school.users << User.find(203) 또는 school.users.find(params[:user_id])과 같은 사용자를 추가 할 수 없기 때문에 has_many 관계가 저에게 제공합니다.

그래서 은 전 기능 지원을 통해 많은 관계로 서로 연결된 두 데이터베이스로 작동하는 방법입니다.

답변

3

나는 모든 기능 지원 레일에이 일의 방법이라고 생각하지 않습니다 - 나는이 프로덕션 DB로 원격 DB 테이블을 가지고 MySQL's federated tables 같은 것을 사용하려고 더 좋을 거라고 생각 .

+0

+1 두통에 걸릴 가능성이 적은 간단한 솔루션처럼 들립니다. – Jeriko

+0

매우 흥미 롭습니다. 그러나 원점과 테이블 복사본을 얼마나 빨리 동기화 할 수 있습니까? – fl00r

+1

@ fl00r - 테이블의 복사본이 아닙니다. 다른 데이터베이스에 직접 연결되므로 동기화가 문제가되지 않습니다. – Codebeef

0

오라클은 이것을 위해 데이터베이스 링크를 사용합니다.

내가 완전히 확실하지 않다,하지만 MySQL은 당신이 당신이 명시 적으로 모델의 테이블 이름을 명시하여 사용하여 레일에 그것을 사용할 수있을 것입니다 그럼

select * from db1.users , db2.schools where db1.users.school_id = db2.schools.id 

을 쓸 수 있다는 것을 발견 :

class School 
    set_table_name "db2.schools" 
end 

그게 도움이 되나요?

+0

가 흥미롭게 보입니다. 조만간 확인해 보겠습니다. – fl00r

관련 문제