2012-04-17 2 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

ответ

0

Я понял это, создав отношение belongs_to к последнему сообщению в моем классе User.

belongs_to :last_message, :class_name => '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

Смежные вопросы