如何在Rails中的AREL中的子查询上进行连接

bra*_*ing 10 inner-join arel ruby-on-rails-3.1

我有一个简单的模型

class User
    has_many :logs


class Logs
Run Code Online (Sandbox Code Playgroud)

通过外键logs.user_id以通常的方式相关.我正在尝试使用Arel执行以下操作,并且根据Arel doc它应该可以工作.

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]))
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我得到了错误

TypeError: Cannot visit Arel::SelectManager
Run Code Online (Sandbox Code Playgroud)

然而,Arel的作者明确暗示 Arel可以做这种事情.

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

小智 8

您可以使用join_sources从Arel :: SelectManager的实例中检索Arel :: Nodes :: Join,并将其传递给连接

使用你的例子:

l_t.joins(counts.join_sources).on(l_t[:id].eq(counts[:user_id]))
Run Code Online (Sandbox Code Playgroud)

  • `l_t [:id] .eq(计数[:user_id])`这有用吗?我的意思是,为什么日志的id应该等于用户的id? (2认同)