Ruby on rails 3.1 如何在Rails中对AREL中的子查询进行连接

Ruby on rails 3.1 如何在Rails中对AREL中的子查询进行连接,ruby-on-rails-3.1,inner-join,arel,Ruby On Rails 3.1,Inner Join,Arel,我有一个简单的模型 class User has_many :logs class Logs 通过外键logs.user\u id以通常的方式进行关联。我正在尝试使用Arel执行以下操作,根据Arel文档,它应该可以工作 u_t = Arel::Table::new :users l_t = Arel::Table::new :logs counts = l_t. group(l_t[:user_id]). project( l_t[:user_i

我有一个简单的模型

class User
    has_many :logs


class Logs
通过外键logs.user\u id以通常的方式进行关联。我正在尝试使用Arel执行以下操作,根据Arel文档,它应该可以工作

u_t = Arel::Table::new :users
l_t = Arel::Table::new :logs

counts = l_t.
    group(l_t[:user_id]).
    project(
        l_t[:user_id].as("user_id"),
        l_t[:user_id].count.as("count_all")
    )

l_t.joins(counts).on(l_t[:id].eq(counts[:user_id]))
当我这样做的时候,我得到了错误

TypeError: Cannot visit Arel::SelectManager
然而,阿雷尔的作者认为,阿雷尔可以做这种事情


请不要写关于如何使用原始sql、另一种类型的Arel查询等实现相同查询的响应。我感兴趣的是模式,而不是此查询的特定结果。

您可以使用join\u源从Arel::SelectManager实例检索Arel::Nodes::join,并将其传递给join

以您的例子:

l_t.joins(counts.join_sources).on(l_t[:id].eq(counts[:user_id]))

这将实现嵌套选择子查询与Arel的连接:

您可以在模型文件中添加嵌套的内部查询和外部查询范围,并使用

  inner_query = Model.inner_query(params)
  result = Model.outer_query(params).joins(Arel.sql("(#{inner_query.to_sql})"))
   .group("...")
   .order("...")
对于这方面的变体,例如要对子查询使用内部联接,请执行以下操作:

  inner_query = Model.inner_query(params)
  result = Model.outer_query(params).joins(Arel.sql("INNER JOIN (#{inner_query.to_sql}) tablealias ON a.id = b.id"))
   .group("...")
   .order("...")
将特定联接、约束和分组添加到每个查询的作用域中,以进一步修改sql语句,即:

scope :inner_query , -> (company_id, name) {
    select("...")
    .joins("left join table1 on table1.id = table2.id")
    .where("table1.company_id = ? and table1.name in (?)", company_id, name)
    .group("...")
}
这允许您在嵌套查询和外部查询上放置WHERE条件

l_t[:id].eq(counts[:user_id])
这有效吗?我的意思是,为什么日志的id应该等于用户的id?