3

나는 효과가 있지만 시끄럽지는 않은 방법을 썼습니다. 내가 더 나은 길을 놓친 건지 궁금 하네.다형성 연관에서 특정 유형의 모든 하위 항목을 얻는 방법

나는 이와 같이 설정된 다형성 연관이 있습니다.

class Employee < ActiveRecord::Base 
    has_many :phones, as: :phoneable 
end 

class Client < ActiveRecord::Base 
    has_many :phones, as: :phoneable 
end 

class Phone < ActiveRecord::Base 
    belongs_to :phoneable, polymorphic: true 
end 

내 폰 표는 표준 phoneable_id:integerphoneable_type:string 열이 있습니다.

내가하고 싶은 일은 이전에 선택한 직원 그룹의 모든 전화를 가져 오는 것입니다 (예 :

employees = Employee.where role: 'peon' 

이 내가 다음과 같은 내 전화 쿼리를 작성합니다 정상적인 has_many 관계라면,

Phone.where employee_id: employees 

내가 아니라 내 쿼리를 작성했습니다 다형성의 관계에서이 작업을 수행하려면;

Phone.where phoneable_type: 'employee', phoneable_id: employees 

이 작동하지만, 명시 적으로 phoneable_type을 진술보다이 일을 더 나은 방법이 있어야합니다 같은 느낌. Rails는 직원들과 함께 제시 될 때 자동으로이를 수행 할 수있는 방법이 있습니까? 아니면 단순화를 위해 과도하게 도달하고 있습니까?

답변

1

다형성 연관성의 중요성을 완전히 이해하지 못했습니다. 당신이 당신의 모델을 정의한 경우, 당신은 쉽게 다음과 같은 레코드를 가져올 수 :

@employee = Employee.where(role: 'peon').first 

지금이 같은 기록을 가져올 수 :

당신이 당신의 직원 테이블의 '페온'역할을 가정 할 수 있습니다 : 당신이 '보병'역할을 직원에 대한 모든 전화를 가져 오기하려면

@employee.phones 

, 다음과 같이 할 수 있습니다

@employees = Employee.where(role: 'peon') 

@peon_phones = @employees.map{|x| x.phones} 
뿐만 아니라 클라이언트의 경우같은

: 당신이 상상

@client = Client.first 

@client.phones 

그것의 간단한. 도움이 되길 바란다. 감사합니다.

+1

그렇습니다. 그와 같은 맵을 사용하면 엄청난 수의 데이터베이스 요청이 발생하고 잠재적으로 매우 느릴 수 있습니다. 나는 항상 데이터베이스 전용 솔루션을 찾고있다. – brad

관련 문제