사용자 모델이 있습니다. 모든 사용자는 회사 소유하고, 회사는 많은 기록이 : 나는 사용자를 인증하기 위해 고안를 사용하고"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
을 ...하지만 액티브 협회와 함께 할 수있는 더 관용적 방법이 있는지 알고 싶어 : 난 그냥 할 수 있습니다.
감사를 사용하지만 수 있습니다. 이것은 피하려고하는 불필요한 쿼리입니다. – ndbroadbent