Uchopit pouze nejnovější příspěvky v kolejích

hlasů
0

V typickém Uživatele - Post - modelu Komentář v Rails, každý uživatel může vytvořit příspěvek a také může vytvořit komentář, otázkou je, jak se chytit každý registrovaný uživatel Poslední komentář k určité pracovní místo.

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

Takže pohled chci, je jen poslední poznámka pro každého uživatele:

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

Jak to udělat ?

dík

Položena 27/08/2009 v 01:26
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
1

Něco takového:

post.comments.for_user(current_user).last

Přidání named_scope v modelu

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

To by mělo stačit.

Máte-li raději to v kolejích,

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

messages_by_users.each do  |key, value|   
    messages_by_users[key] = value.last
end
Odpovězeno 27/08/2009 v 01:32
zdroj uživatelem

hlasů
0

Za předpokladu, že vaše databáze je přiřazení sekvenční identifikátory na komentáře, můžete to udělat:

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

To vám dává způsob dvou dotazu, které lze použít v mnoha různými způsoby. named_scopeNad stáhne nejnovější komentáře pro všechny uživatele na všech pracovních míst. To může být problém, pokud vaše databáze je obrovská, ale můžete určitě přidat podmínky, aby byl konkrétnější.

Jak to stojí, to je flexibilní metoda, která umožňuje provést následující:

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
Odpovězeno 27/08/2009 v 02:49
zdroj uživatelem

hlasů
0

Měl jsem dostat tento druh dat a obvykle jsem se nakonec dělá dva dotazy. V mém případě jsem blogy a jejich příspěvky a chtěl jsem seznam 3 nejnovějších příspěvcích s tím omezením, že blogy jsou jedinečné, nechci 2 příspěvky ze stejného blogu. Skončil jsem dělat něco takového (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")    

Takže v případě, že by mohl mít něco takového:

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")
Odpovězeno 27/08/2009 v 02:34
zdroj uživatelem

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