Как получить таблицу ассоциации хабтм-ассоциации? - PullRequest
5 голосов
/ 05 января 2012

У меня есть две ActiveRecord модели, которые имеют ассоциацию HABTM.

Я хочу написать scope, чтобы получить записи-сироты с использованием Arel.

Моя проблема в том, чтоНе могу найти метод для получения arel_table ассоциации.Поскольку отношение HABTM, нет модели для вызова arel_table.

Теперь у меня есть следующее (что работает), но я создаю новую таблицу с именем объединяемой таблицы (полученную с помощью метода reflect_on_association).

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:

SELECT `teachers`.* 
FROM `teachers`    
WHERE (`teachers`.`id` NOT IN (SELECT `groups_teachers`.`teacher_id`  
                               FROM `groups_teachers` ))

Так есть ли лучший способ получить arel_table вместо создания нового?

Ответы [ 2 ]

3 голосов
/ 26 июня 2012

К сожалению, я полагаю, что ваше решение является в значительной степени самым чистым из существующих на данный момент и фактически является тем, что сама ассоциация делает внутренне при реализации:

https://github.com/rails/rails/blob/46492949b8c09f99db78b9f7a02d039e7bc6a702/activerecord/lib/active_record/associations/has_and_belongs_to_many_association.rb#L7

Я считаю,the Reflection.join_table, которую они используют, против refle.options [: join_table] сейчас только в master.

2 голосов
/ 19 ноября 2012

Если вы знаете название ассоциации и, следовательно, таблицу соединений, которая в данном случае выглядит так, как вы, вы должны позвонить:

Arel::Table.new(:groups_teachers)

В моем тестировании это возвращает таблицу Ареля ассоциации habtm. Спасибо этому ответу за указание на это мне.

...