sql - 如何获取habtm协会的arel表?

标签 sql ruby-on-rails ruby-on-rails-3 activerecord arel

我有两个 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/

相关文章:

ruby-on-rails - 如何在 RAILS 中使用 AJAX 销毁微博时重新加载当前页面

php - 将一个值插入到一个表中,其中 id 与另一个表中给定值的 id 相匹配

MySQL 分组依据缺失值

ruby-on-rails - 我有点迷失: how to render rails/ruby on a website?

ruby-on-rails - 不了解 Bundler 与 Gems 的交互

ruby - 如何每小时执行一个函数并将结果添加到 Rails 中的数据库中?

sql喜欢和之间

sql - 使用 clickhouse 计算当前行和上一行之间的差异(或增量)

ruby-on-rails - Rails 4 使用局部变量渲染部分内容

ruby-on-rails - 即使在设置 schema_format = :sql 后,schema.sql 也不会创建