2014-11-02 87 views
3

我想通過父ID來過濾ActiveRecord_AssociationRelation s。ActiveRecord:按屬性唯一

所以,我想這樣的名單:

[#<Message id: 25, posted_by_id: 3, posted_at: "2014-10-30 06:02:47", parent_id: 20, content: "This is a comment", created_at: "2014-10-30 06:02:47", updated_at: "2014-10-30 06:02:47">, 
    #<Message id: 23, posted_by_id: 3, posted_at: "2014-10-28 16:11:02", parent_id: 20, content: "This is another comment", created_at: "2014-10-28 16:11:02", updated_at: "2014-10-28 16:11:02">]} 

返回此:

[#<Message id: 25, posted_by_id: 3, posted_at: "2014-10-30 06:02:47", parent_id: 20, content: "This is a comment", created_at: "2014-10-30 06:02:47", updated_at: "2014-10-30 06:02:47">] 

我已經試過各種方法,包括:

@messages.uniq(&:parent_id) # returns the same list (with duplicate parent_ids) 

@messages.select(:parent_id).distinct # returns [#<Message id: nil, parent_id: 20>] 

uniq_by已從Rails 4.1中移除。

回答

3

你試過

group(:parent_id) 

這聽起來好像是你所追求的。這確實會返回給定parent_id的第一個條目。如果你想要最後一個條目,你將不得不重新排列子查詢中的結果,然後使用該組。

+0

感謝,這正是我想要的。 – user3281384 2014-11-05 00:50:55

3

爲我的Rails 3.2 & PostgreSQL中,Foo.group(:巴)適用於簡單的查詢,但給了我一個錯誤,如果我有任何地方上有條款,例如

irb> Message.where(receiver_id: 434).group(:sender_id) 
=> PG::GroupingError: ERROR: column "messages.id" must appear in the 
    GROUP BY clause or be used in an aggregate function 

我結束了指定一個SQL'DISTINCT ON'子句進行選擇。在消息類我有以下範圍:

scope :latest_from_each_sender, -> { order("sender_id ASC, created_at DESC").select('DISTINCT ON ("sender_id") *') } 

用法:

irb> Message.where(receiver_id: 434).latest_from_each_sender