2011-03-18 4 views
0

Ruby on Rails 앱에서 ajax로 업데이트되는 위/아래 투표 시스템을 구현했습니다. 버튼은 create 메소드를 호출하고, 투표가 데이터베이스에 삽입되며, 투표 합계가 계산됩니다.투표 기능 수정

그러나 현재로서는 사용자가 원하는만큼 upvote 또는 downvote 수 있습니다. StackOverflow에서 투표를 원한다면 사용자가 한 번만 위 또는 아래로 투표 할 수 있고 투표는 취소 할 수 있습니다. 이 논리를 어떻게 구성합니까?

답변

1

나는 여러 종류의 웹 사이트에 대해 이러한 종류의 요구 사항에 사용해온 것이므로 acts_as_rateable 보석을 권하고 싶습니다. 그 일을 완벽하게해라.

직접 구현하려는 경우 Rating 모델은 user_id이어야하며 평가할 모델에 첨부 할 수 있도록 다형성이어야합니다. 그런 다음 중복 투표를 거부하도록 AJAX 컨트롤러를 코딩 할 수 있습니다. 프론트 엔드에서 기존 upvote/downvote에서 링크 기능을 제거하는 Javascript가 좋은 UX 용으로 구현되어야합니다.

+0

지금은 video_id와 user_id가 모두 포함 된 독립적 인 리소스입니다. –

+0

동영상 만 평가할 수 있다면 등급 올릴 수 있습니다. 이 경우, 당신은 아마'@previous_rating = Rating.where (: video_id => params [: video_id], : user_id => current_user.id) .first'를하고'@ previous_rating.nil? '을 체크하여 사용자가 이전에이 비디오를 평가했습니다. 그가 가지고있는 경우 들어오는 등급을 확인하고 다른 경우 upvote/downvote로 변경하거나 동일한 경우 반환하십시오. –

+0

이것은 의미가 있습니다. 왜'where '호출이 끝날 때'.first'를해야합니까? 사용자가 한 번만 투표해야합니까? –

0

나는 조금 더 할 일이 있다고 생각합니다. 모델에 질문과 사용자 간의 다 대다 관계를 추가해야합니다. 사용자는 어떤 질문에 투표했는지, 어떤 방법으로 (위 또는 아래로) 투표했는지 기억해야합니다. 그 후에, 화면에서 질문을 렌더링 할 때, 표시된 테이블과 관련된 현재 사용자의 투표를 해당 테이블에서 선택해야합니다.

사용자가 질문에 투표 할 때 해당 테이블에 레코드를 추가해야합니다. 또한 질문을 표시 할 때 사용자가 upvoted (downvoted) 한 경우 upvote (downvote) 링크를 따라 스타일을 지정해야합니다. 사용자가 다시 투표를 시도하면 사용자가 이미 투표 한 경우 데이터베이스에 투표를 등록하기 전에이를 확인할 수 있습니다.

이런 종류의 작업을 수행하는 가장 빠른 방법은 아니지만 가장 제어력이 뛰어납니다 (나중에 특정 사용자의 투표 스타일, 투표일에 대한 날짜 및 시간에 대한 자세한 통계를 표시 할 수 있음). 주조, 당신은) ... 사용자가 등등 하루에 캐스팅 할 수 있습니다 투표 수에 제한을 부과 할 수

+0

이미 video_votes를 독립적인 리소스로 사용하여 비디오와 사용자간에 많은 관계가 있습니다. 조언 해주셔서 감사합니다. –

+0

그러면 사용자가 이미 데이터베이스에 투표를 계속하기 전에 투표 한 경우 ajax 메소드를 체크인해야합니다. –

+0

예, 그게 내가 할 일입니다. –

0
class Vote < ActiveRecord::Base 
    belongs_to :question 
    belongs_to :user 

    validates_uniqueness_of :user_id, :scope=>question_id  
end 

http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M000086

번 이상 투표하려고하면 오류를 반환합니다 컨트롤러 . 투표 한 투표를 취소하면 UI에 투표가 삭제됩니다.

+0

사용자가 두 번째 upvotes 경우 투표를 취소해야합니다, 그래서 이것이 내가 무엇을 찾고 있다고 생각하지 않습니다. –

+0

두 번째 투표를 허용하는 이유는 무엇입니까? –

+0

보다 구체적으로, 투표가 존재하면 UI는 => : delete 메서드를 보내야합니다. 그것은 바로 그 방법입니다. –