我有两个 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))
}
这将产生以下 SQL:
SELECT `teachers`.*
FROM `teachers`
WHERE (`teachers`.`id` NOT IN (SELECT `groups_teachers`.`teacher_id`
FROM `groups_teachers` ))
那么有没有更好的方法来检索
arel_table
而不是制作一个新的?
最佳答案
不幸的是,我相信您的解决方案现在几乎是最干净的,事实上,关联本身在实例化时在内部所做的事情:
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 中。
关于sql - 如何获取habtm协会的arel表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8747284/