Sql Rails 4连接分组方式并选择
我正在尝试连接Rails 4中的两个表,以执行计数并保留连接表的一列 型号:用户有多个:订单 我想要的是:订单数量和上次订单的日期Sql Rails 4连接分组方式并选择,sql,ruby-on-rails,join,Sql,Ruby On Rails,Join,我正在尝试连接Rails 4中的两个表,以执行计数并保留连接表的一列 型号:用户有多个:订单 我想要的是:订单数量和上次订单的日期 has_many :orders, -> { select("users.*, count(orders.id) as orders_count").group('users.id') } 我想在ORDERS表中选择created_at列,如下所示 select("users.*, orders.created_at, count(orders.id) as
has_many :orders, -> { select("users.*, count(orders.id) as orders_count").group('users.id') }
我想在ORDERS表中选择created_at列,如下所示
select("users.*, orders.created_at, count(orders.id) as orders_count").group('users.id')
但在这种情况下,我得到了一个错误
PG::GroupingError: ERROR: column "orders.created_at" must appear in the GROUP BY clause or be used in an aggregate function
我需要第一个在处创建的_,所以我在created_at列上尝试了SQL聚合函数“FIRST”
select("users.*, first(orders.created_at) as most_recent, count(orders.id) as orders_count").group('users.id')
但我会
PG::UndefinedFunction: ERROR: function first(character varying) does not exist
你知道我如何实现这个连接,在连接的表上进行计数和选择吗?下面的步骤对你有用吗
User.joins(:orders)
.select("users.*, max(orders.created_at) as most_recent, count(orders.id) as orders_count")
.group('users.id')
获取订单的max
。在
创建的\u应提供最近订单的日期。我认为你不想让你的选择作为有许多订单的一部分,因为你要的是用户列表,而不是订单列表。如果您想要一个返回此活动记录查询的方法,假设您将多次使用它,则可以将以下内容添加到您的User
模型中
def self.with_order_info
self.joins(:orders)
.select("users.*, max(orders.created_at) as most_recent, count(orders.id) as orders_count")
.group('users.id')
end
然后,您可以在任何地方使用以下方法调用该方法:
@users = User.with_order_info
作为进一步说明(要100%清楚),您应保持与订单的关联,如下所示:
has_many :orders
你能发布你的关系模型并准确描述你想要什么吗?您想要每个用户的订单数量吗?只需编辑question@stefano_cdn,您使用的是哪个版本的PostgreSQL?因此,我认为您需要,类名称:“Users”
,位于范围块之后。但我可能会生气……你仍然需要做另一个查询来获取@stefano_cdn正在寻找的信息。@jcunod来获取什么信息?我不知道你的意思。据我所知,我的答案捕获了OP正在寻找的所有信息。我还稍微修改了我的答案(因为select
不应该是has\u many:orders
关联的一部分)。Thx@JoeKennedy,我还计划在has\u many:through关系中使用select来获取关系表的列。在这里,您的答案很好,如果您想要分组并保留一个不是日期而是字符串的列,该怎么办:您不能使用MAX函数,但是否有一个聚合函数可以保留这些列而不进行任何操作(正如我在最初的问题中提到的,我尝试了第一次和最后一次,但都不起作用)如果max
对字符串不起作用,那么我不确定是否有一个聚合函数可以起作用。可能需要一个嵌套查询。