Rails: как сортировать сообщения с комментариями? - PullRequest
1 голос
/ 10 августа 2011

Сообщение может иметь несколько комментариев:

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

Как я могу написать именованную область видимости, которая возвращает сообщения, которые имеют сообщение (само сообщение или один из его комментариев), которое было создано за определенный промежуток времени, упорядоченный по времени создания самого последнего сообщения (последнее сначала)? 1007 *

Пример:

Если существуют следующие сообщения:

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 года. Message 2 является первым, потому что у него есть последнее сообщение (август 2011).

Ответы [ 2 ]

1 голос
/ 10 августа 2011
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
0 голосов
/ 10 августа 2011

Это не в моей голове, но я думаю, что вы можете сделать:

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