如何获得habtm协会的arel表?

Mah*_*ver 5 sql activerecord ruby-on-rails arel ruby-on-rails-3

我有两个ActiveRecord有HABTM关联的模型.

我想写一个scope使用Arel来获取孤儿记录.

我的问题是我找不到一种方法来检索arel_table关联.由于关系是HABTM,因此没有可以调用的模型arel_table.

我现在有以下(有效),但我创建了一个新的arel表,其中包含连接表的名称(使用该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))
}
Run Code Online (Sandbox Code Playgroud)

这会产生以下SQL:

SELECT `teachers`.* 
FROM `teachers`    
WHERE (`teachers`.`id` NOT IN (SELECT `groups_teachers`.`teacher_id`  
                               FROM `groups_teachers` ))
Run Code Online (Sandbox Code Playgroud)

那么有没有更好的方法来检索arel_table而不是创建一个新的?

Mik*_*air 4

不幸的是,我相信您的解决方案几乎是目前最干净的解决方案,事实上,这就是关联本身在实例化时在内部所做的事情:

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

我相信他们使用的reflection.join_table与reflection.options[:join_table]目前仅在master中。