2010-12-13 75 views
0

J'essaie de trouver des commentaires créés après un datetime qui n'ont pas été créés par l'utilisateur actuel.Refactorisation d'une recherche pour les enfants de parents créés après un certain temps

Au début, je l'ai fait ..

current_user.comments.find(:all, :conditions=>["created_at > ? AND user_id != ?", 
          current_user.last_checked_mail, current_user]) 

mais le problème ici est que parce qu'il commence par le modèle utilisateur, ses commentaires ne trouvant exclusivement faites par cet utilisateur.

Ainsi, au lieu, j'ai commencé de chercher tous les commentaires associés à l'utilisateur, et les enfants des commentaires tant que leurs user_id ne current_user

Comment.find(:all, :conditions => ["user_id = ?", current_user]).select { |c| 
    c.comments.find(:all, :conditions => ["user_id != ?", current_user]) 
} 

Mais il semble que dessine encore chaque commentaire lié à la current_user, et pas leurs enfants.

Mon modèle Commentaire:

belongs_to :commentable, :polymorphic => true 
has_many :comments, :as => :commentable 

Répondre

1

Vous avez donc une relation parent dans votre modèle de commentaire? Utiliser ça!

class Comment < ActiveRecord::Base 

    belongs_to :user 
    belongs_to :parent, :class_name => "Comment" 

    def self.after(date) 
    where "created_at > ?", date 
    end 

    def self.replies_for(comments) 
    where :parent_id => comments.map(&:id) 
    end 

    def self.exclude_user(user_id) 
    where "user_id != ?", user_id 
    end 

end 

class User < ActiveRecord::Base 

    has_many :comments 

    def new_comments 
     comments.after(last_check_mail) 
    end 

    def new_responses 
     Comment.replies_for(new_comments).after(last_check_mail).exclude_user(id) 
    end 

end 

current_user.new_responses 

PS. Ceci est pour Rails 3.

+0

Ceci est une réponse très excitante. J'apprends pas mal de nouvelles choses ici.Le seul hic est que cela n'exclut pas les commentaires faits par l'OP – Trip

+0

J'ai essayé ceci .. mais il ne semble pas fonctionner 'where: commentable_id => commentaires.map (&: id),: user_id! = User .id' – Trip

+0

Parce que ce n'est pas une syntaxe valide pour un hachage. J'ai mis à jour la réponse un peu. Je vois que vous utilisez le polymorphisme. Je laisse cela pour vous de comprendre;) – iain

1

Essayez:

Comment.find(:all, :conditions => ["created_at > ? AND user_id != ?", current_user.last_checked_mail, current_user]) 
+0

Ah oui, mais une variable de plus est nécessaire. Le commentaire parent doit appartenir à l'utilisateur actuel. Dans ce cas, tous les commentaires ont un identificateur de commentaire qui correspond à l'ID de leur commentaire parent. – Trip

+1

Oh, je vois. Ce n'était pas très clair dans votre question. Vous voulez donc uniquement sélectionner les commentaires enfants, qui appartiennent aux commentaires appartenant à l'utilisateur? Dans ce cas, il devient salissant, mais vous pourriez vouloir quelque chose comme: Comment.find (: all,: jointures =>: commentable,: conditions => ["created_at>: temps ET user_id! =: Utilisateur ET commentable.user_id = : user AND commentable_id n'est pas nul ",: time => current_user.last_checked_mail,: user => utilisateur_utilisateur]) – idlefingers

+0

Ah ça devient moche. J'étais curieux de savoir si ça ne devait pas ... J'ai obtenu ceci: 'ActiveRecord :: EagerLoadPolymorphicError: Impossible de charger avec impatience l'association polymorphe: commentable' Curieux si c'est de ma faute. – Trip

1

Essayez ceci:

Comment.all(:conditions => ["user_id != ? AND parent_id = ? AND created_at > ?", 
      current_user.id, current_user.id, current_user.last_checked_mail]) 

meilleure solution est de créer un named_scope sur le modèle Comment.

class Comment 

    named_scope :other_comments, lambda {|u| { :conditions => 
       ["user_id != ? AND parent_id = ? AND created_at > ?", 
        u.id, u.id, u.last_checked_mail ] }} 
end 

Maintenant, vous pouvez obtenir d'autres commentaires comme:

Comment.other_comments(current_user) 

Modifier 1 réponse Mise à jour sur la base des associations polymorphes:

class Comment 
    def self.other_comments(u) 
    Comment.all(
     :joins => "JOIN comments A 
       ON A.commentable_type = 'User' AND 
         A.commentable_id = #{u.id} AND 
         comments.commentable_type = 'Comment' AND 
         comments.commentable_id = A.id", 

     :conditions => ["comments.user_id != ? AND comments.created_at > ?", 
      u.id, u.last_checked_mail] 
    ) 
    end 
end 

Maintenant vous pouvez obtenir d'autres commentaires comme:

Comment.other_comments(current_user) 
+0

Le parent_id appelé commentable_id, et ce numéro fait seulement référence à l'ID du commentaire, où, j'ai besoin de l'ID de l'utilisateur qui a fait le commentaire parent. Les commentaires sont joints dans une table polymorphe. Je vais mettre à jour ci-dessus. – Trip

+0

Mis à jour la réponse jetez un oeil. –