2014-03-30 3 views
2

입니다. UserBusiness의 두 가지 모델이 있습니다. 많은 사용자가 비즈니스를 소유 할 수 있으며 사용자는 많은 비즈니스를 소유 할 수 있습니다.레일은 has_many 연관성을 지니고 있지만 키 이름은

사용자는 비즈니스 또는 클라이언트의 직원 일 수도 있습니다.

소유자 비즈니스 협회에 초점을 맞추는 동안 소유자로 언급하는 동안 사용자 ID를 사용하려고 할 때 문제가 발생했습니다.

나는 BussinessesOwners 테이블에 가입하고 다음 모델이 설정 한 :

class User < ActiveRecord::Base 
    has_many :businesses, through: :businesses_owners 
end 

class Business < ActiveRecord::Base 
    has_many :owners, :class_name => 'User', :foreign_key => "owner_id", through: :businesses_owners 
end 

class BusinessesOwners < ActiveRecord::Base 
    belongs_to :users, :foreign_key => "owner_id" 
    belongs_to :businesses 
end 

BusinessesOwners 마이그레이션 :

class CreateBusinessOwners < ActiveRecord::Migration 
    def change 
    create_table :business_owners, :id => false do |t| 
     t.integer :business_id 
     t.integer :owner_id 
    end 
    end 
end 

을 나는 사용자 모델로 참조 할 수있는 연결을 설정하는 방법 소유자? - 그래서 Businesses.owners는 사용자 목록을 반환합니까?

답변

3

개인적으로 연관 테이블을 기반으로 한 연관성을 말합니다. 다시 말하면 owner_id 대신 user_id입니다. HABTM 관계를 수행하지 않으므로 "buisinesses_owners"규칙에 구속되지 않고 BusinessOwnership 또는 Ownership과 같은 더 좋은 이름을 사용할 수 있습니다 (예 : 사용자와 사용자의 소유 관계를 다형성으로 사용하는 경우). 다른 모델).

관통 모델의 belongs_to은 단수이어야합니다. (큰 소리로 연관을 읽고 당신이 그것을 이해 여기에 복수 사용하지 않습니다 듣게 될 것입니다.) 이렇게 작동해야 다음

: 여기

class User < ActiveRecord::Base 
    has_many :businesses, through: :business_ownerships 
    has_many :business_ownerships 
end 

class Business < ActiveRecord::Base 
    has_many :owners, through: :business_ownerships, source: :user 
    has_many :business_ownerships 
end 

class BusinessOwnership < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :business 
end 

을 그리고 마이그레이션은 다음과 같습니다

class CreateUsers < ActiveRecord::Migration 
    def change 
    create_table :users do |t| 
     t.string :name 
    end 
    end 
end 

class CreateBusinesses < ActiveRecord::Migration 
    def change 
    create_table :businesses do |t| 
     t.string :name 
    end 
    end 
end 

class CreateBusinessOwnerships < ActiveRecord::Migration 
    def change 
    create_table :business_ownerships do |t| 
     t.references :user 
     t.references :business 
    end 
    end 
end 

참고 : BusinessOwnership에 추가 속성을 추가하거나 다형성 Ownership 모델로 재활용하지 않는 한 여기에서 "has_many through"를 수행 할 필요는 없습니다. 다음과 같이 명명 된 조인 테이블과 HABTM 관계를 수행 할 수도 있습니다. 해당 사기 vention.

+0

이것은 내가 생각하는 대답입니다 - 내가 필요한 이유가 무엇인지 설명 할 수 있습니다 –

+0

훌륭한 답변입니다! ': user_id' & 'business_id'라는 이름의'CreateBusinessOwnerships' 컬럼을 사용하려면 무엇을해야합니까? –

+1

바로 그것들입니다 :'t.references : user'는't.integer : user_id'라고하는 좀 더 의미있는 방법입니다. – svoop