두 개의 ActiveRecord
모델에 HABTM 연관이 있습니다.habtm 연관의 arel 테이블을 얻는 방법?
Arel을 사용하여 고아 레코드를 가져 오려면 scope
이라고 쓰고 싶습니다.
제 문제는 연관의 arel_table
을 검색하는 방법을 찾을 수 없다는 것입니다. 관계가 HABTM이므로 arel_table
을 호출 할 모델이 없습니다.
다음은 작동합니다 (작동).하지만 reflect_on_association
메서드를 사용하여 검색 한 조인 테이블의 이름을 사용하여 새로운 arel 테이블을 만듭니다.
SELECT `teachers`.*
FROM `teachers`
WHERE (`teachers`.`id` NOT IN (SELECT `groups_teachers`.`teacher_id`
FROM `groups_teachers`))
그래서 arel_table
를 검색하는 대신 새로운 하나를 만들기 위해 더 좋은 방법이 :
scope :orphans, lambda {
teachers = arel_table
join_table = Arel::Table.new(reflect_on_association(:groups).options[:join_table])
join_table_condition = join_table.project(join_table[:teacher_id])
where(teachers[:id].not_in(join_table_condition))
}
이 다음과 같은 SQL을 생성? 불행하게도
참고, 나는 이것을 할 수있는 더 깨끗한 방법이 있다고 생각합니다. 내 대답은 아래를 참조하십시오. – Andrew