1

メッセージは、複数のコメントを持つことができます。Rails:コメント付きのメッセージを並べ替えるには?

class Message < ActiveRecord::Base 
    has_many :comments 
end 

class Comment < ActiveRecord::Base 
    belongs_to :message 
end 

次の名前付きスコープは、作成時刻順時間の与えられた範囲で作成されたメッセージは、(最新の最初)を返します。

scope :created_between, 
     lambda { |rng| where("created_at" => (rng[:start_time]..rng[:end_time])). 
        order("created_at DESC") } 

どのようにできました最新の投稿(最新のもの)の作成時間順に並べられた、指定された時間範囲内に作成された投稿(メッセージ自体またはそのコメントの1つ)を持つメッセージを返す名前付きスコープを記述する

例:

次のメッセージが存在する場合:

Message 1   April, 2010 
    Comment 1   May, 2011 
    Comment 2   July 2011 
Message 2   January 2011 
    Comment 1   August 2011 
    Comment 2   March 2011 
    Comment 3   February 2011 
Message 3   March 2009 
    Comment 1   January 2010 
Message 4   June 2011 

その後、

scope :has_post_between({:start_time => <February 2010>, 
         :end_time => <August 2011>}), ... 

は返す必要があります:

Message 2 
Message 1 
Message 4 

Message 3が原因で含まれていませんその投稿は2010年2月より前に作成されました。 Message 2は、最新の投稿(2011年8月)を持っているため、最初です。

答えて

0

これは私の頭の上からですが、私はあなたがすることができると思う:

Message.joins(:comments).where(["comments.start_time > ? AND comments.end_time < ?", start_time, end_time]); 
+0

あなたが考慮にメッセージ自体を取ることはありません。 –

1
class Message < ActiveRecord::Base 
    has_many :comments 

    scope :updated_between, lambda { |rng| 
    joins(:comments). 
    where(:created_at => rng, :comments => { :created_at => rng }). 
    order("comments.created_at DESC, messages.created_at DESC") 
    } 
end 
関連する問題