Pegue apenas o mais recente comentário no Rails

votos
0

Em um típico usuário - Post - modelo de comentário no Rails, cada usuário pode criar um post e também pode criar comentário, questão é como agarrar cada utilizador mais recente comentário no posto específico.

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

Então a visão que eu quero é apenas o mais recente comentário para cada usuário:

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

Como fazer isso ?

obrigado

Publicado 27/08/2009 em 01:26
fonte usuário
Em outras línguas...                            


3 respostas

votos
1

Algo assim:

post.comments.for_user(current_user).last

adicionar um named_scope no seu modelo

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

Isso deve fazer o truque.

Se você prefere fazê-lo em trilhos,

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

messages_by_users.each do  |key, value|   
    messages_by_users[key] = value.last
end
Respondeu 27/08/2009 em 01:32
fonte usuário

votos
0

Assumindo que o seu banco de dados é a atribuição de IDs seqüenciais para os comentários, você pode fazer isso:

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

Isto dá-lhe um método de dois consulta que você pode usar em uma variedade de maneiras. O named_scopeacima puxa para trás os mais recentes comentários para todos os usuários em todos os posts. Isso pode ser um problema se o seu banco de dados é gigantesca, mas certamente você pode adicionar condições para torná-la mais específica.

Tal como está, é um método flexível que permite que você faça o seguinte:

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
Respondeu 27/08/2009 em 02:49
fonte usuário

votos
0

Eu tive que obter este tipo de dados e, geralmente, eu acabo fazendo duas consultas. No meu caso eu tenho Blogs e seus postos e eu queria uma lista dos 3 mais recentes posts com a restrição de que os blogs são únicos, eu não quero 2 posts do mesmo blog. Acabei fazendo algo parecido com isto (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")    

Assim, no seu caso, você pode ter algo como:

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")
Respondeu 27/08/2009 em 02:34
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more