Ruby on rails Rails 4-如何重写";。通过“U sql”查找“U”;是否使用ActiveRecords方法执行查询?

Ruby on rails Rails 4-如何重写";。通过“U sql”查找“U”;是否使用ActiveRecords方法执行查询?,ruby-on-rails,ruby,join,activerecord,model,Ruby On Rails,Ruby,Join,Activerecord,Model,我坚持将我使用的查询(基本上是原始SQL)转换为使用ActiveRecord方法的查询。我尝试转换它的原因是,我需要在其中使用作用域 find_by_sql("SELECT COUNT(s.id) AS count_all, SUM(s.gross_profit) AS sum_gross_profit, se.user_id, u.id,

我坚持将我使用的查询(基本上是原始SQL)转换为使用ActiveRecord方法的查询。我尝试转换它的原因是,我需要在其中使用作用域

find_by_sql("SELECT 
               COUNT(s.id) AS count_all,
               SUM(s.gross_profit) AS sum_gross_profit,   
               se.user_id,
               u.id,
               u.first_name,
               u.last_name,
               u.role
             FROM shipments s 
             INNER JOIN senders se ON se.id = s.sender_id 
             INNER JOIN users a ON a.id = se.user_id 
             WHERE ((#{status}) 
               AND (se.admin_id IS NOT NULL)
             GROUP BY se.user_id 
             ORDER BY count_all DESC")
  }
如何将所有这些
s
se
u
别名和2个
内部联接
转换为ActiveRecord查询

编辑:我尝试的内容:

select("COUNT(shipments.id) AS count_all,
        SUM(shipments.gross_profit) AS sum_gross_profit,   
        senders.admin_id,
        users.id,
        users.first_name,
        users.last_name,
        users.role")
.joins("INNER JOIN senders ON senders.id = shipments.sender_id 
        INNER JOIN users ON users.id = senders.user_id")
.where("((#{status}) 
          AND (senders.admin_id IS NOT NULL)")
.group("senders.user_id") 
.order("count_all DESC")
但这只返回如下输出:

{16=>41, 46=>34, 54=>2, 55=>1, 56=>1}:Hash

谢谢你

看起来你最后想要的是
用户
实例,还有一些额外的属性。在这种情况下,ActiveRecord将使用来自用户的
,因此您需要稍微重写您的连接。因为一切都是一个
内部连接
,这很容易。所以我要这样做:

User.select("COUNT(shipments.id) AS count_all,
        SUM(shipments.gross_profit) AS sum_gross_profit,   
        senders.admin_id,
        users.*")
.joins("INNER JOIN senders ON senders.user_id = users.id 
        INNER JOIN shipments ON shipments.sender_id = senders.id")
.where("(SOMETHING HERE)
          AND senders.admin_id IS NOT NULL")
.group("users.id") 
.order("count_all DESC")
我删除了
{status}
,因为这看起来像是一个严重的安全漏洞。您应该学习如何使用
where(“foo=?”,bar)
来防止SQL注入


甚至在原始SQL中也有一些不匹配的参数,所以我清理了它们。

看起来您最终想要的是
User
实例,还有一些额外的属性。在这种情况下,ActiveRecord将使用来自用户的
,因此您需要稍微重写您的连接。因为一切都是一个
内部连接
,这很容易。所以我要这样做:

User.select("COUNT(shipments.id) AS count_all,
        SUM(shipments.gross_profit) AS sum_gross_profit,   
        senders.admin_id,
        users.*")
.joins("INNER JOIN senders ON senders.user_id = users.id 
        INNER JOIN shipments ON shipments.sender_id = senders.id")
.where("(SOMETHING HERE)
          AND senders.admin_id IS NOT NULL")
.group("users.id") 
.order("count_all DESC")
我删除了
{status}
,因为这看起来像是一个严重的安全漏洞。您应该学习如何使用
where(“foo=?”,bar)
来防止SQL注入


甚至在原始SQL中也有一些不匹配的参数,所以我清理了它们。

您尝试了什么?你看过AR文件了吗?查看联接、includes、where、count、group。添加了我正在尝试的当前查询……如果您有类似的查询,通常最好将它们保存在sqlnever do this
。其中((#{status})和(senders.admin_id不为NULL))
除非sql injection是你的朋友谢谢@phoet的评论。我有意将其保持原样,采用sql格式,但需要使用其他作用域进行此查询,这迫使我将其重写为ActiveRecord的方法。你尝试了什么?你读过AR文档吗?查看连接,包括,where,count,group。添加了我正在尝试的当前查询…如果您有类似的查询,通常最好将它们保存在sqlnever do this
。其中((#{status})和(senders.admin_id不为NULL)
除非sql注入是你的朋友,否则谢谢@phoet的评论。我有意将其保持原样,采用sql格式,但需要为该查询使用其他作用域,这迫使我将其重写为ActiveRecord的方法。