has_many关系的每个最后元素的范围

假设我在User和Messages之间有一个has_many关系。

我想设置一个范围,以便能够通过他们发布的最后一条消息中的内容过滤用户。 所以只搜索每个用户的最后一条消息。

下面我得到了所有消息中的结果……

class Contact < ActiveRecord::Base has_many :messages scope :filter_by_last_messages, lambda { |value| joins(:messages).where("messages.content = ?", value) } end 

在范围内一次性执行此操作是不可能的,但您可以这样做:

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

在你的控制器中:

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

所以有一点可以限定范围。

我通过在我的User类中创建与最后一条消息的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) }