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

私はUserクラスの中で最後のメッセージとのbelongs_toリレーションシップを作成することでそれを理解しました。

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

関連する問題