Ruby on rails Rails范围中的顺序不正确

Ruby on rails Rails范围中的顺序不正确,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我不完全理解rails作用域的功能。rails查询: UserDesign.joins(:order_line_items) .where('order_line_items.created_at > ?',Date.today-1.month) .find(:all, :select=>'order_line_items.design_id as id,sum(order_line_items.quantity) as quantity',

我不完全理解rails作用域的功能。rails查询:

UserDesign.joins(:order_line_items)
     .where('order_line_items.created_at > ?',Date.today-1.month)
     .find(:all,
           :select=>'order_line_items.design_id as id,sum(order_line_items.quantity) as quantity',
           :group=>'order_line_items.design_id',
           :order=>'quantity desc'
     )
返回以下项目:

 UserDesign Load (0.8ms)  SELECT order_line_items.design_id as id,sum(order_line_items.quantity) as quantity FROM "user_designs" INNER JOIN "order_line_items" ON "order_line_items"."design_id" = "user_designs"."id" WHERE (order_line_items.created_at > '2012-11-12') GROUP BY order_line_items.design_id ORDER BY quantity desc
+-----+----------+
| id  | quantity |
+-----+----------+
| 199 | 65       |
| 196 | 31       |
| 197 | 31       |
| 198 | 30       |
| 204 | 30       |
| 203 | 30       |
+-----+----------+
这是正确的,但只包括两列。与命名范围相同的查询产生:

UserDesign Load (0.7ms)  SELECT order_line_items.design_id as id,sum(order_line_items.quantity) as quantity FROM "user_designs" INNER JOIN "order_line_items" ON "order_line_items"."design_id" = "user_designs"."id" WHERE (order_line_items.created_at > '2012-11-12') GROUP BY order_line_items.design_id ORDER BY quantity desc
UserDesign Load (1.0ms)  SELECT "user_designs".* FROM "user_designs" 
+-----+-------+---
| id  | de... |...
+-----+-------+---
| 196 | aa... |...
| 199 | fd... |...
| 198 | as... |...
| 197 | as... |...
| 203 | Test  |...
| 204 | My... |...
+-----+-------+---
SQL查询是相同的,返回所有列,但顺序不正确。我也愿意

使用顺序正确的命名范围 将普通查询包装在函数中,但返回所有列 谢谢

编辑:

为完整起见,以下是命名范围:

scope :popular_this_month, lambda{
     joins(:order_line_items)
     .where('order_line_items.created_at > ?',Date.today-1.month)
     .find(:all,
           :select=>'order_line_items.design_id as id,sum(order_line_items.quantity) as quantity',
           :group=>'order_line_items.design_id',
           :order=>'quantity desc'
     )}

在第一种情况下,您将传递一个select选项,指定这两列,因此这两列就是返回的内容。如果需要更多列,请列出它们。您可以使用table_name.*获取一个表的所有列

在第二种情况下,您在命名范围内调用find,这没有任何意义-命名范围只是一组条件和选项,您不应该在其中实际执行find。我怀疑在这种情况下,它忽略了所有你要寻找的选项

你想要更多类似于

scope :popular_this_month, lambda{
     joins(:order_line_items).
     where('order_line_items.created_at > ?',Date.today-1.month).
     select(...).
     order(...).
     group(...)}

这将导致与第一个示例相同的行为。

值得避免的一件事是将老式的find语法与较新的where等语法混合使用


我认为这可能是问题所在。

SQL查询是相同的-我不这么认为,它似乎从user_Design返回SELECT user_Design.*。你能公布你的命名范围,这样我们就可以看看它是否真的是等效的吗?好眼睛。我不确定是什么触发了这一切。将我使用的命名范围添加到原始问题。当然,这是在作用域中丢弃的完全相同的查询。是的。谢谢剩下的唯一问题是如何包含所有列。我可以将列添加到select语句中,但如果我没有将它们也添加到group_by,则会得到get:ActiveRecord::StatementInvalid:PG::Error:Error:column user_designs.title必须出现在group by子句中或在聚合函数中使用。这更像是一个SQL问题,真的。也许这最好作为一个单独的问题问。是的。子查询就是答案!是的。我没有思考。谢谢
scope :popular_this_month, lambda {
  joins(:order_line_items)
    .where('order_line_items.created_at > ?', Date.today - 1.month)
    .select('order_line_items.design_id as id,sum(order_line_items.quantity) as quantity')
    .group('order_line_items.design_id')
    .order('quantity desc')
}