Рефакторинг находки для детей родителей, созданных через некоторое время - PullRequest
0 голосов
/ 13 декабря 2010

Я пытаюсь найти комментарии, созданные после даты и времени, которые не были сделаны текущим пользователем.

Сначала я сделал это ..

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

, но проблема здесь былапотому что он начинается с пользовательской модели, он находит только комментарии, сделанные исключительно этим пользователем.

Так что вместо этого я начал искать все комментарии, связанные с пользователем, и эти комментарии - дети, пока их user_id неthe current_user

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

Но, похоже, по-прежнему рисуются все комментарии, связанные с current_user, а не их дочерними элементами.

Мой комментарий Модель:

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

Ответы [ 3 ]

1 голос
/ 13 декабря 2010

Попробуйте:

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

Лучшее решение - создать named_scope на модели 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

Теперь вы можете получать комментарии других пользователей как:

Comment.other_comments(current_user)

Редактировать 1 Обновлен ответ на основе полиморфных ассоциаций:

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

Теперь вы можете получить другие комментарии в виде:

Comment.other_comments(current_user)
1 голос
/ 13 декабря 2010

Итак, у вас есть родительские отношения в вашей модели комментариев? Используйте это!

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. Это для Rails 3.

1 голос
/ 13 декабря 2010

Попробуйте:

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