ruby-on-rails - 你能加入另一个在 ARel 中不是关联的表吗?

标签 ruby-on-rails postgresql arel

当我想查找分配有特定方案的特定页面时(全部通过 scheme_assignment),我有一些正在运行的 SQL:

Page.find_by_sql("
    SELECT pages.id
    FROM pages
    INNER JOIN scheme_assignments ON (scheme_assignments.schemable_type = 'Page' AND
                                      scheme_assignments.schemable_id = pages.sid)
    INNER JOIN schemes ON (schemes.sid = scheme_assignments.scheme_id AND
                           schemes.sid IN (4,6,7))
    GROUP BY pages.id")

当我尝试将其转换为 ARel 时:

Page.select("pages.id")
    .joins("scheme_assignments")
    .on("scheme_assignments.schemable_type = 'Page' AND scheme_assignments.schemable_id = pages.sid")
    .joins("schemes")
    .on("schemes.sid = scheme_assignments.scheme_id AND schemes.sid IN (1)")
    .group("pages.id")

我会得到这个错误:NoMethodError: undefined methodjoin_sql' for "schemes":String`

怎么会?是因为它不是我的 Page 模型中的关联吗?是否可以在不在模型中创建关联的情况下将该 SQL 转换为 ARel?

最佳答案

Page.joins("INNER JOIN scheme_assignments 
        ON (scheme_assignments.schemable_type = 'Page' AND scheme_assignments.schemable_id = pages.sid) 
        INNER JOIN schemes 
        ON (schemes.sid = scheme_assignments.scheme_id AND schemes.sid IN (4,6,7))").
    select("DISTINCT pages.*");

关于ruby-on-rails - 你能加入另一个在 ARel 中不是关联的表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7079383/

相关文章:

sql - Arel 导致聚合无限循环

ruby-on-rails - 如何使用 Rails 验证限制行数/文本行数?

ruby-on-rails - 性能:最小化数据库命中

ruby-on-rails - 保存前如何在 Rails 中使用 ST_GeoHash 和 ST_MakePoint postgis 函数?

ruby-on-rails - 请安装 postgresql 适配器 : `gem install activerecord-postgresql-adapter`

security - 在只有 md5 加密的 postgres 中,保存密码的最佳方法是什么?

ruby-on-rails - 带有Rails AREL : SQL Case statement的复杂订单声明

ruby-on-rails - Rails simple_form:自定义输入ID

ruby-on-rails - Rspecs 失败并显示 Test::Unit 自动运行程序消息

mysql - 按共同关联的数量排序,即使没有(rails)