2011-12-06 3 views
0

레거시 데이터베이스가 있습니다. 사용자에게는 많은 계정이 있고 계정에는 많은 사용자가 있습니다. UserAccountMapping이라는 조인 테이블이 있습니다.레일 3 has_and_belongs_to_many

===================== 
|UserID | AccountID| 
===================== 

두 열 모두 var char 유형입니다. join_table => : UserAccountMapping : foreign_key => 계정 ID : association_foreign_key =>

Account.rb에서

:

has_and_belongs_to_many : 사용자 아이디 User.rb에서

:

has_and_belongs_to_many : 계정 : join_table => 'UserAccountMapping', : foreign_key => : 사용자 ID는 : association_foreign_key => :

를 계정 아이디

사용자는 : email 및 : id 열도 갖습니다. 사용자의 기본 키는 다음과 같습니다. id (정수) 및 : email는 문자열입니다.

User.first.accounts과 같은 작업을 수행하면 조인 SQL의 WHERE 절이 UserAccountMapping.UserID를 사용자의 : id와 일치 시키려고 시도하지만 사용자의 : 전자 메일을 사용하려고합니다. 이것이 가능한가?

그래서, 생성하는 SQL은 다음과 같습니다

것은 "계정"SELECT * FROM "계정"INNER는 "계정"ON "UserAccountMapping을"가입 "계정 ID"= "UserAccountMapping" "계정 ID"... .

것은 "계정"SELECT * "계정"INNER는 "계정"ON "UserAccountMapping"을 가입 FROM "계정 ID"대신 "UserAccountMapping" "아이디"= 3

, 나는 이것을 원한다.. = "UserAccountMapping". "Accoun tID "어디에서"UserAccountMapping "."UserID "="[email protected] "

+0

왜 그렇게하고 싶습니까? 'User' 프라이 머리 키 =>를 설정해보십시오 : email – Damien

답변

1

여기에 데이터를 구성한 방법은 반 - 레일이므로 그것을 얻기 위해 싸워야 할 것입니다. 일하다. 그것이 대회의 어려움입니다. 곡물에 대항하여 달리면 구현하기가 매우 어려워집니다.

user_id 대신 UserID과 같은 비표준 열 이름을 사용하면 응용 프로그램에 막대한 양의 복잡성이 발생합니다. 가능하다면 Rails 스타일로 전환하고 모든 것을 무효화해야하는 번거 로움을 덜어줍니다.

has_and_belongs_to_many은 Rails 1의 유물이므로 Rails 2+의 has_many :through만큼 유용하지 않으므로 사용하지 마십시오. 필요한 것은 조인 테이블에 id 기본 키 열과 두 개의 belongs_to 관계를 설정하는 관련 모델 파일입니다.

표준이 아닌 id 열을 사용하면 문제가 발생할 수 있으므로 최후의 수단으로 만 사용해야합니다.시간의 대부분은 당신이 그것을 위해 해당 컬럼에 UNIQUE 지수 파인더 방법을 사용하여이 문제를 해결 할 수 있습니다

@user = User.find_by_email(email) 
@account = @user && @user.accounts.first 

는 "레일 방식"상황이 훨씬 더 작업을 수행합니다. Rails를 배우는 좋은 방법 중 하나는 언제 대회를 할 것인지, 언제 어떻게 대회에 참가할 것인가와 어려움에 처하지 않고 자신 만의 방식으로 나아갈 수있는 방법을 아는 것입니다.

+0

불행히도, 그것은 레거시 데이터베이스입니다, 그래서 나는 레일 규칙을 따르도록 칼럼 이름을 바꿀 수 없습니다. 또한 has_many : through 기능을 시도했지만 동일한 문제가 있습니다. – Garrett

+0

레일스를 사용하지 않는 것에 대해 생각해보아야합니다. 레일스가 매우 어려울 것이기 때문입니다. ( – Dorian

+1

벽에 부딪혔다면 [Sequel] (http : // sequel.rubyforge.org/) ActiveRecord 대신 ORM. 많은 가정을하지 않고 자유로운 키 배열을 처리 할 수 ​​있으므로 훨씬 유연 해집니다. – tadman