Rails:如何用评论对消息进行排序?

时间:2011-08-10 13:28:47

标签: ruby-on-rails ruby-on-rails-3 active-relation active-record-query

消息可以有多个注释:

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") }

如何编写一个命名范围,该范围返回在给定时间范围内创建的具有post(消息本身或其中一条注释)的消息,按最新帖子的创建时间(最新的第一个)排序? / p>

示例:

如果存在以下消息:

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月)。

2 个答案:

答案 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

答案 1 :(得分:0)

这是我的头脑,但我认为你可以做到:

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