2010-12-13 9 views
0

現在のユーザーが作成していないdatetimeの後に作成されたコメントを検索しようとしています。時間の後に作成された親の子の検索をリファクタリングする

は、まず、私はこれをしなかった。..

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

が、問題はここでは、ユーザモデルから始まるので、その唯一の発見コメントは、もっぱらそのユーザーによって行われたということでした。

はので、代わりに、私はそう長く自分のuser_idは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 

答えて

1

コメントモデルに親関係がありますか?それを使用してください!

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のためのものです。

+0

これは非常にエキサイティングな対応です。私はここでかなり新しいことを学んでいます。唯一のキャッチは、これがOPによって作られたコメントを除外しないということです。 – Trip

+0

私はこれを試しましたが、動作していないようです。 ':commentable_id => comments.map(&:id)、:user_id!= user .id' – Trip

+0

これはハッシュの有効な構文ではないためです。私は少し答えを更新しました。多形性を使っているのが分かります。私はあなたが把握するためにそれを残す;) – iain

1

試してみてください。

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

はい、しかしもう一つ変数が必要です。親コメントは、現在のユーザーが所有している必要があります。この場合、すべてのコメントは親コメントのIDであるcommentable_idを持ちます。 – Trip

+1

ああ、そうだ。それはあなたの質問ではあまり明確ではありませんでした。だからあなたは、ユーザーが所有しているコメントに属する子コメントだけを選択したいと思っていますか?その場合、面倒ですが、Comment.find(:all、:joins =>:commentable、:conditions => ["created_at>:time and user_id!=:user AND commentable.user_id = :userとcommentable_idはnullではありません "、:time => current_user.last_checked_mail、:user => current_user]) – idlefingers

+0

ああ、醜いです。私はそれが必要ない場合は興味がありました..私はこの 'ActiveRecord :: EagerLoadPolymorphicError:多形関連を熱心に読み込むことはできません:commentable'これが私の誤りであるかどうか不思議です。 – Trip

1

はこれを試してみてください:

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

より良い解決策がCommentモデルにnamed_scopeを作成することです。

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 

今、あなたは他の人のコメントのように得ることができます:

:今、あなたのように他の人のコメントを取得することができます

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 更新の答えを

Comment.other_comments(current_user) 
+0

parent_idはcommentable_idと呼ばれ、その番号はコメントのIDのみを参照しています。ここでは、親コメントを作成したユーザーのIDが必要です。コメントは多態的な表で結合されます。上記で更新します。 – Trip

+0

答えが一新されました。 –

関連する問題