Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails4按联接组中的列别名排序_Ruby On Rails_Ruby On Rails 4_Activerecord - Fatal编程技术网

Ruby on rails Rails4按联接组中的列别名排序

Ruby on rails Rails4按联接组中的列别名排序,ruby-on-rails,ruby-on-rails-4,activerecord,Ruby On Rails,Ruby On Rails 4,Activerecord,我想按每个类别产品数量的降序排列类别的段塞(产品最多的类别段塞排在第一位,没有产品的类别段塞排在最后) I Rails 3.2查询 Category. joins("LEFT OUTER JOIN products ON products.category_id = categories.id"). select('count("products"."id") as products_count'). group("categories.slug"). order("produc

我想按每个类别产品数量的降序排列类别的段塞(产品最多的类别段塞排在第一位,没有产品的类别段塞排在最后)

I Rails 3.2查询

Category.
  joins("LEFT OUTER JOIN products ON products.category_id = categories.id").
  select('count("products"."id") as products_count').
  group("categories.slug").
  order("products_count desc").
  select("categories.slug")
成功了。 但是升级后,我得到了一个

ActiveRecord::StatementInvalid: PG::UndefinedColumn
错误,表示列产品\u计数不存在

...and_id = categories.id GROUP BY categories.slug  ORDER BY products_c...

如何修复它?

ORDER BY无法识别别名

快速修复:

Category.
  joins("LEFT OUTER JOIN products ON products.category_id = categories.id").
  group("categories.slug").
  order('count("products"."id") desc').
  select("categories.slug")

为什么它在升级之前工作,但在升级之后不工作?我不确定,但我想这与添加到ActiveRecord中的优化(延迟执行)有关。

我在项目中遇到了类似的问题,我使用了
顺序(1)
,而不是重构查询,这对于我的场景来说不是一个可行的替代方案


它允许我使用
选择
别名
。我个人不喜欢“幻数”,但它在这种情况下很有用。

如果没有普通的SQL,你怎么能进行这种查询?ActiveRecord仍然只支持“正常连接”。如何仅使用内置的AR方法进行此查询?我想在您的情况下创建SQL视图是最好的。有没有一种创建SQL视图的ActiveRecord方法?如果别名函数根本不需要,那么我就不能不删除整个
。选择(
-line)并以
Category.joins(“products.Category\u id=categories.id上的左外部连接产品”).group(“categories.slug”).order('count(“products”。.id”)desc')。选择(“categories.slug”)
(抱歉,注释中的格式不是最好的)?是的,我认为您可以安全地删除第一个
select
。至于视图,您可以在迁移中使用纯SQL创建它们,然后像使用表一样使用它们。更多信息:查询实际上是相同的(更改自
select count(“产品”。.id”)作为产品计数,categories.slug FROM“categories”左外部连接产品。brand\u id=categories.id按类别分组。slug ORDER BY products\u count desc
to
选择类别。slug FROM“categories”左外部连接产品。brand\u id=categories.id按类别分组。slug ORDER BY count(“产品”。“id”)desc
并且结果也匹配。稍后我将查看Rails的SQL视图,并暂时接受您的答案
Category.
    joins("LEFT OUTER JOIN products ON products.category_id = categories.id").
    select('count("products"."id") as products_count').
    group("categories.slug").
    order(1)