2015-09-30 25 views
0

我有一個模型'用戶',可以有多個'遊樂設施'(has_many:遊樂設施)。乘坐的表看起來像這樣:Rails的範圍,其中groupby計數

# Table name: rides 
# 
# id      :integer   not null, primary key 
# user_id     :integer 
# title     :text 
# description    :text 

我想創建一個名爲「is_multiple_ride」的換乘模式,它返回具有擁有多個遊樂設施供使用者騎乘一個範圍。查詢是不同的幾乎是相反的(:USER_ID)

我所創建的範圍如下:

scope :multiple_live_listings, -> { 
    where(user_id: Ride.group(:user_id).having("COUNT(user_id) > 1").pluck(:user_id)) 
} 

此範圍工作然而,隨着多個連鎖範圍使用時,它的效率不高,因爲它是查詢乘車的整個乘車表格(爲了抽取ID,然後在範圍查詢中使用它們),而不是僅檢查當前查詢中的乘車。

如果有更有效的方法來做到這一點,請幫助!我正在使用PostgreSQL 9.3.5和Rails 3.2.2,歡呼!

+0

測試我的db,Rails 4.1只創建一個子查詢,如果你省略'pluck' - 像你一樣添加'pluck',給我兩個單獨的查詢。這是否有助於提高效率?如果不是,那麼你究竟在詢問什麼問題,以查看緩慢/低效的結果? – eirikir

回答

0

給定一個有3次遊樂設施的用戶,如果你希望範圍返回所有3次遊樂設施,那麼你必須稍微遠離rails helpers(下面的例子)。如果您只需要一次乘坐多次乘坐的乘客,Muntasim的解決方案就可以運作。

scope :multiple_live_listings, -> { 
    where('rides.user_id IN (SELECT user_id FROM rides GROUP BY user_id HAVING COUNT(user_id) > 1)') 
} 
+0

該解決方案與我已有的解決方案完全相同,只是您使用原始SQL而不是AR助手來完成。 –

+0

也許是這樣,但結果是返回1查詢而不是2. –

+1

Rails AR會自動將其變爲子查詢:http://stackoverflow.com/a/10838510/2577822 –