Prenez seulement le dernier commentaire dans Rails

voix
0

Dans un utilisateur typique - Post - modèle Commentaire dans Rails, chaque utilisateur peut créer un poste et peut également créer commentaire, une question est de savoir comment saisir chaque utilisateur le dernier commentaire sur le message spécifique.

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

Ainsi, l'opinion que je veux est juste le dernier commentaire pour chaque utilisateur:

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

Comment faire ?

Merci

Créé 27/08/2009 à 01:26
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
1

Quelque chose comme ça:

post.comments.for_user(current_user).last

ajouter un named_scope dans votre modèle

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

Cela devrait faire l'affaire.

Si vous le faites plutôt dans des rails,

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

messages_by_users.each do  |key, value|   
    messages_by_users[key] = value.last
end
Créé 27/08/2009 à 01:32
source utilisateur

voix
0

J'ai dû obtenir ce genre de données et d'habitude je finissent par faire deux requêtes. Dans mon cas, je Blogs et leurs messages et je voulais une liste des 3 derniers messages de blog avec la restriction que les blogs sont uniques, je ne veux pas que 2 messages du même blog. J'ai fini par faire quelque chose comme ça (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")    

Donc, dans votre cas, vous pourriez avoir quelque chose comme:

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")
Créé 27/08/2009 à 02:34
source utilisateur

voix
0

En supposant que votre base de données est d'attribuer des ID séquentiels aux commentaires, vous pouvez le faire:

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

Cela vous donne une méthode à deux requêtes que vous pouvez utiliser dans une variété de façons. Le named_scopeci - dessus retire les commentaires les plus récents pour tous les utilisateurs sur tous les messages. Cela pourrait être un problème si votre base de données est gigantesque, mais vous pouvez certainement ajouter des conditions pour le rendre plus précis.

En l'état actuel, il est une méthode flexible qui vous permet d'effectuer les opérations suivantes:

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
Créé 27/08/2009 à 02:49
source utilisateur

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