2015-05-04 31 views
1

我想在Rails 4中加入2個表,以執行計數並保留連接表的列。Rails 4加入GROUP BY和SELECT

模式:用戶的has_many:訂單

我想要什麼:訂單號,最後令的日期。

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所以我在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 

任何想法,我怎麼能做到這一點JOIN,COUNT並選擇連接表?

+0

你可以發佈你的模型關係,並準確地描述你想要什麼嗎?你想要每個用戶的訂單數量? – Typpex

+0

剛剛編輯問題 –

+0

@stefano_cdn,您正在使用哪個版本的PostgreSQL? –

回答

3

下面的工作適合你嗎?

User.joins(:orders) 
    .select("users.*, max(orders.created_at) as most_recent, count(orders.id) as orders_count") 
    .group('users.id') 

order.created_atmax應爲您提供最近訂單的日期。我不認爲你想讓你的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 

然後,你可以調用任何地方使用方法:

@users = User.with_order_info 

如進一步的說明(100%清晰),你應該讓你聯想到的命令爲:

has_many :orders 
+0

你仍然必須做另一個查詢才能獲得信息@stefano_cdn正在尋找。 – jcuenod

+0

@jcuenod得到什麼信息?我不確定你是什麼意思。據我所知,我的答案包含了OP正在尋找的所有信息。我也改了一下我的答案(因爲'select'不應該是'has_many:orders'關聯的一部分)。 –

+0

Thx @JoeKennedy,我也計劃在has_many:through關係中使用select來獲取關係表的列。這裏你的答案很好,如果你想分組並保留一個不是日期的字段而是一個字符串:你不能使用MAX函數,但是不存在一個聚合函數來保持列沒有操作(我試過FIRST和最後,不起作用,因爲我在我的第一個問題中提到) –