2012-04-17 73 views
3

假設我在用戶和消息之間有has_many關係。作用於has_many關係的每個最後元素的範圍

我想設置一個範圍,以便能夠過濾那些在發佈的最後消息中包含某些內容的用戶。所以只能在每個用戶的最後一條消息中搜索。

下面我把所有信息中的結果...

class Contact < ActiveRecord::Base 
    has_many :messages 

    scope :filter_by_last_messages, lambda { |value| 
     joins(:messages).where("messages.content = ?", value) 
    } 
end 
+1

我不認爲你可以做到這一點沒有在SQL子查詢...... – phoet 2012-04-17 19:54:42

回答

0

我通過在用戶類中創建與最後一條消息的belongs_to關係來計算出它。

belongs_to :last_message, :class_name => 'Message' 

我在Message類的after_create中設置了我的最後一條消息。 然後我的範圍僅僅是如下:

scope :filter_by_last_messages, lambda { |value| 
    joins(:last_message).where("content = ?", value) 
} 
1

的範圍在一杆這樣做是不可能的,但你可以這樣做:

scope :last_message, joins(:messages) 
     .select("contacts.*, messages.content") 
     .order("messages.created_at") 

在你的控制器:

if @contact.last_message.content == value 
    do_something 
end 

所以有一點可以作用域。

+0

謝謝,這是我所擔心的。 – pierrea 2012-04-18 07:20:45