Захватите только последний комментарий в Rails - PullRequest
0 голосов
/ 27 августа 2009

В типичной модели User - Post - Comment в Rails каждый пользователь может создать сообщение, а также создать комментарий, вопрос в том, как получить последний комментарий каждого пользователя к конкретному сообщению.

Example:

Post A have 3 user making comment
User 1 have comment 1, 2, 3, 4, 5, 6
User 2 have comment 1, 2, 3, 4
User 3 have comment 1, 2

Таким образом, нужное мне представление - это самый последний комментарий для каждого пользователя:

Post A have 3 user making comment
User 1 latest comment that is 6
User 2 latest comment that is 4
user 3 latest comment that is 2

Как это сделать?

спасибо

Ответы [ 3 ]

1 голос
/ 27 августа 2009

Примерно так:

post.comments.for_user(current_user).last

добавить named_scope в вашу модель

class Comment 
    named_scope :for_user, lambda{ |user| {:conditions=>{:user_id => user.id}}
end

Это должно сработать.

Если вы предпочитаете делать это в рельсах,

messages_by_users  = post.messages.group_by(&:user)

messages_by_users.each do  |key, value|   
    messages_by_users[key] = value.last
end
0 голосов
/ 27 августа 2009

Предполагая, что ваша база данных присваивает комментарии последовательным идентификаторам, вы можете сделать это:

class Comment
  named_scope :most_recent, lambda {
     lastest_comments = Comment.maximum :id, :group => "user_id, post_id"
     { :conditions => [ "comment_id in ?", lastest_comments.map(&:last) ] }
  }
end

Это дает вам метод с двумя запросами, который вы можете использовать различными способами. Приведенное выше значение named_scope возвращает самые последние комментарии всех пользователей ко всем сообщениям. Это может быть проблемой, если ваша база данных гигантская, но вы, безусловно, можете добавить условия, чтобы сделать ее более конкретной.

В его нынешнем виде это гибкий метод, который позволяет выполнять следующие действия:

Comment.most_recent.find_by_user @user   #-> the most recent comments on all posts by a user
@user.comments.most_recent               #-> same as above

Comment.most_recent.find_by_post @post   #-> the most recent comments on a single post by all users
@post.comments.most_recent               #-> same as above

Comment.most_recent.find_by_user_and_post @user, @post    #-> the specific most recent comment by a certain user on a certain post
@post.comments.most_recent.find_by_user @user             #-> you get the idea
0 голосов
/ 27 августа 2009

Мне приходилось получать данные такого рода, и обычно я заканчивал тем, что делал два запроса. В моем случае у меня есть Блоги и их сообщения, и я хотел получить список из 3 самых последних сообщений в блоге с ограничением, что блоги являются уникальными, я не хочу 2 сообщения из того же блога. В итоге я сделал что-то вроде этого (MySQL):

q = <<-EOQ
SELECT id,pub_date FROM
  (
  SELECT id,blog_id,pub_date
  FROM posts 
  ORDER BY pub_date DESC 
  LIMIT 40
  )
t
GROUP BY blog_id
ORDER BY pub_date DESC
LIMIT #{num_posts}
EOQ
post_ids = Post.connection.select_values(q)
Post.find(:all, :include => [:blog], :conditions => ["id IN (?)", post_ids], :order => "posts.pub_date DESC")    

Так что в вашем случае у вас может быть что-то вроде:

q = <<-EOQ
SELECT id FROM
  (
  SELECT id,post_id
  FROM comments 
  ORDER BY id DESC 
  LIMIT 40
  )
t
GROUP BY post_id
ORDER BY id DESC
LIMIT 10
EOQ
post_ids = Post.connection.select_values(q)
Post.find(:all, :include => [:blog], :conditions => ["id IN (?)", post_ids], :order => "posts.id DESC")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...