0

사용자 모델이 있습니다. 모든 사용자는 회사 소유하고, 회사는 많은 기록이 : 나는 사용자를 인증하기 위해 고안를 사용하고"has_many : through"를 작성하여 INNER JOIN 대신 일반 WHERE 쿼리 만 사용하는 가장 좋은 방법은 무엇입니까?

class User < ApplicationRecord 
    belongs_to :company 
end 

class Company < ApplicationRecord 
    has_many :records 
end 

class Record < ApplicationRecord 
    belongs_to :company 
end 

를, 그래서 확실히 난 단지 반환하고있어 기록을 만들기 위해, current_user와 내 모든 쿼리를 시작하려는 그 사용자는 볼 수 있습니다. 난 그냥 뭔가를 호출 할 :

current_user.company_records 

(내가 회사를로드 할 필요가 없기 때문에, current_user.company.records를 호출하고 싶지 않아 난 그냥 기록을해야합니다.).

을 내가 할 경우 :

has_many :company_records, source: :records, through: :company 

그리고 레일은 내부는 총 인 참여 않습니다

2.3.3 :030 > user.company_records 
    Record Load (0.5ms) SELECT "records".* FROM "records" INNER JOIN "companies" ON 
    "records"."company_id" = "companies"."id" WHERE "companies"."id" = $1 [["id", 1]] 

나는 t을 할 필요가 그의 :

2.3.3 :039 > user.company_records 
    Record Load (0.4ms) SELECT "records".* FROM "records" WHERE "records"."company_id" = $1 [["company_id", 1]] 

이 작성하는 더 좋은 방법이 있나요 :

has_many :company_records, 
      class_name: 'Record', 
      primary_key: :company_id, 
      foreign_key: :company_id 

그런 다음 레일은 단순한 "여기서"쿼리를 (적절한 인덱스를 가지고있는) 실행?

def company_records 
    Record.where(company_id: company_id) 
end 

을 ...하지만 액티브 협회와 함께 할 수있는 더 관용적 방법이 있는지 알고 싶어 : 난 그냥 할 수 있습니다.

답변

0

대리인을 사용 하시겠습니까?

delegate :records, to: :company, prefix: true 

그럼 당신은 직접이 모든 레코드를로드하기 전에 delegate`는 또한 회사를로드`당신의 대답을

current_user.company_records 
+0

감사를 사용하지만 수 있습니다. 이것은 피하려고하는 불필요한 쿼리입니다. – ndbroadbent