2012-07-02 23 views
1

我看過類似的問題,但沒有找到與我需要的答案完全匹配的答案。如果它在外面,我還沒有看到它。我on Rails的3.1,紅寶石1.9.2,部署在Heroku上雪松堆棧(所以我使用的是Postgres)RoR/Postgres查詢所有父母的第一個或最後一個子對象

我有了這個模型:

class User 
    has_many :orders 
end 

class Order 
    belongs_to :user 

    #scope :last_for_each_user, ??? 
    #scope :first_for_each_user, ??? 

end 

我需要的範圍(或方法)返回所有用戶的第一個訂單的所有訂單,以及所有用戶的最後一個訂單的所有訂單。我的第一個直覺是使用GROUP BY,它在SQLite3中的last_for_each_user上工作正常,但Postgres不會讓你選擇不在GROUP BY子句中或作爲聚合函數的一部分選擇的列,而且我需要完全形成的命令對象(即所有的列,命令。*)。

任何想法?我不想選擇整個表並在Ruby中對其進行排序。這只是感覺不對,而且要記住很多東西。

回答

1

所以這裏就是我最後做,爲未來的頭刮管:

scope :last_for_each_user, lambda { 
    select("orders.*") & Order.select("max(orders.id) as id").group("orders.user_id") 
} 
scope :first_for_each_user, lambda { 
    select("orders.*") & Order.select("min(orders.id) as id").group("orders.user_id") 
} 

如果任何人有一個更好的主意,我非常開放的聽到它。感謝整個SO社區(儘管沒有人迴應),這是我第一次註冊/問一個問題,但每次我在谷歌的一個問題,我最終在這裏!

+0

什麼'Order.where(ID:Order.select( 「分鐘(orders.id)的ID」)組( 「orders.user_id」)。)'? – cbliard

0

您可以使用DISTINCT ON()規則只獲取最後一個。下面是一個例子如下模型結構:

scope :for_users, lambda {|ids, is_first| includes(:user).where("user_id IN (?)", ids).select("DISTINCT ON (users.id) *").order("orders.created_at ?", is_first ? : "ASC" : "DESC") } 
scope :last_for_each_users, lambda { |users| for_each_users(users.map{|u| u.id }, false } 
scope :first_for_each_users, lambda { |users| for_each_users(users.map{|u| u.id }, true } 
相關問題