2009-11-19 2 views
0

나는 평소 게시물과 댓글 컨트롤러/모델과 함께 의견을 남길 수있는 사용자 모델과 함께 꽤 표준적인 블로그 앱을 가지고있다. 레일스 블로그 앱에서 가장 업데이트 된 댓글 업데이트 방법

그래서 사용자 모델에서 나는
has_many :comments 

그리고 코멘트 모델 매우 정직하고

belongs_to :post 
belongs_to :user 

모두에서

있습니다.

내가 만드는 앱에서 댓글이 약간 다르게 작동하기를 원합니다. 사용자가 처음으로 코멘트를 남기면 새 코멘트를 작성합니다. 그러나 사용자 당 게시물 당 하나의 댓글 만 허용하고 싶습니다. 사용자가 다른 코멘트를 남기려하면 기존 코멘트 만 업데이트해야합니다.

내가 사용자 모델

has_many :posts, :through => :comment 

에 그리고 내가 show 액션에 다음을 가지고있는 게시물 컨트롤러에이를 추가 한이 작업을 수행합니다.

if post = current_user.posts.find_by_permalink(params[:id]) 
    @comment = post.comments.find_by_user_id(current_user) 
else 
    @comment = Comment.new 
end 

이 사용자가 이미이 게시물에 댓글을 만든 경우는 검사 점에서 작동 그래서 그것은 주석보다는 게시 된 새에 대한 업데이트가 발생합니다 경우.

하지만 위의 코드는 나와 맞지 않습니다. 보다 우아한 솔루션이 있습니까?

+1

"기존 댓글을 업데이트"란 말의 내용을 새 내용으로 바꾸거나 두 항목을 병합하는 것을 의미합니까? –

답변

2

이 방법은 문제가 없지만 논리를 모델로 옮겨야합니다. 또한 validates_uniqueness_of을 사용하여 유효성 검사를 추가하는 것이 좋습니다. 포스트에

당신은 할 수 :
has_many :comments do 
    def find_or_build_for_user(user) 
     find_by_user_id(current_user.id) || self.comment.build(:user => user) 
    end 
end 

그런 다음 컨트롤러에서 당신이 할 것 :

@comment = post.comments.find_or_build_for_user(current_user) 

위의 용도 협회 확장, 당신은 여기에 대한 자세한 내용을보실 수 있습니다 :

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

제가 위의 사항대로 작동하는지 잘 모르겠습니다. 그것을 테스트하지 마라. 그러나 그것은 당신을 바른 방향으로 가르쳐야한다.

+0

그게 완벽합니다. 연관 확장에 대해서는 전혀 몰랐습니다. 매우 유용했습니다. 감사. – KJF

+0

매우 유용 할 수 있지만 과도하게 사용하지 마십시오. 별도의 모듈에 넣고 연관에 : extend 옵션을 사용할 수도 있습니다. 컨트롤러를 마른 체형으로 유지하고 모델을 뚱뚱하게하십시오! (http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model). – jonnii

관련 문제