1

メッセージには複数のコメントを含めることができます。

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月)があるため、最初になります。

4

2 に答える 2

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
于 2011-08-10T14:01:24.693 に答える
0

これは私の頭の上から外れていますが、できると思います:

Message.joins(:comments).where(["comments.start_time > ? AND comments.end_time < ?", start_time, end_time]);
于 2011-08-10T13:40:14.507 に答える