ste*_*cdn 2 sql join ruby-on-rails
我正在尝试在Rails 4中联接2个表,以执行计数并保留联接表的列。
型号:用户has_many:orders
我想要的是:订单数量和最后订单的日期。
has_many :orders, -> { select("users.*, count(orders.id) as orders_count").group('users.id') }
Run Code Online (Sandbox Code Playgroud)
我想像这样在ORDERS表中选择created_at列
select("users.*, orders.created_at, count(orders.id) as orders_count").group('users.id')
Run Code Online (Sandbox Code Playgroud)
但是在那种情况下我会得到一个错误
PG::GroupingError: ERROR: column "orders.created_at" must appear in the GROUP BY clause or be used in an aggregate function
Run Code Online (Sandbox Code Playgroud)
我需要FIRST created_at,因此我在created_at列上尝试了SQL聚合函数“ FIRST”
select("users.*, first(orders.created_at) as most_recent, count(orders.id) as orders_count").group('users.id')
Run Code Online (Sandbox Code Playgroud)
但是我会得到
PG::UndefinedFunction: ERROR: function first(character varying) does not exist
Run Code Online (Sandbox Code Playgroud)
知道如何在联接表上实现此JOIN,COUNT和SELECT吗?
以下内容对您有用吗?
User.joins(:orders)
.select("users.*, max(orders.created_at) as most_recent, count(orders.id) as orders_count")
.group('users.id')
Run Code Online (Sandbox Code Playgroud)
服用max的order.created_at应该给你最近的订单的日期。我认为您不希望将其select作为has_many订单的一部分,因为您要查找的是用户列表,而不是订单列表。如果要使用返回此活动记录查询的方法,并假设您将多次使用它,则可以将以下内容添加到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
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用以下任何地方调用该方法:
@users = User.with_order_info
Run Code Online (Sandbox Code Playgroud)
进一步说明(100%清楚),您应保持与订单的关联为:
has_many :orders
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8899 次 |
| 最近记录: |