2008-11-04 5 views
2

여러 모델/클래스에 다형성으로 적용 할 수있는 콘텐츠 투표 메커니즘을 어떻게 설계 할 것입니까? 제 를 - - 질문 - 유권자가 등록을 요구해서는 안콘텐츠 투표 데이터베이스 및 응용 프로그램 디자인

제품 :

는 이러한 클래스의 인스턴스가 투표 할 수 있다는 것을 감안할 때 (루비에에 바람직하게는 컨텍스트를 레일하지만, 다른 사람은 정상입니다).

유권자를 대상 당 한 표로 제한하기 위해 최선의 노력을 기울여야합니다. (특정 기사에 대해 1 표 및 특정 질문에 대해 1 표). 나는. ip 탐지, 쿠키 등을 사용하십시오.

+0

프로그래밍과 관련이없는 것은 무엇입니까? –

답변

1

당신은 다형성으로 말했습니다. 이것이 핵심 단어입니다.

ActsAsTaggable의 작동 방식을 살펴보십시오. 특정 모델에 투표 동작을 제공하는 ActsAsVotable "플러그인"을 만들 수 있습니다. 투표는 다형성 belongs_to를 갖는 다른 모델 (투표?)에 저장됩니다.

create_table :orders do |t| 
    t.string :votable_type 
    t.integer :votable_id 
    t.integer :vote 
    t.timestamps 
end 

귀하의 acts_as_votable 호출이 장면은 표와 연관됩니다 뒤에 : 다시

has_many :votes, :as => "votable" 

, ActsAsTaggable를 참조하십시오. :)

0

답장을 보내 주셔서 감사합니다. 그래, 다형성 가능한 모델을 만드는 것이 길이다. 그러나 나는 더 완전한 답을 추출하려고 시도하고 있었다.

예를 들어 여기까지 제가 생각한 바가 있습니다. 이 시나리오에서는 여러 클래스 (Article, Question, Product)에 묶일 수있는 투표 가능 클래스입니다.

투표 테이블 : id : 정수, 투표 : 부울, voteable_type : string (투표중인 클래스의 이름), voteable_id : 정수 (투표중인 클래스의 ID), voter_id (사용자 투표의 ID).

이제 등록을 요구하지 않고 사용자 당 투표 수를 제한해야합니다. 따라서 voter_id는 사용자의 IP 주소와 user_agent를 포함하는 복합 요소가 될 수 있습니다. 이것은 내가 아이디어에 개방되어있는 곳입니다. 수집 된 IP 주소가 법인 프록시 등에서 오는 경우 반드시 고유하지는 않으므로 사용자 에이전트의 도움이 필요합니다. 그러나 여전히 두 명의 사용자가 동일한 IP 및 사용자 에이전트 문자열을 가질 수있는 경우가 있습니다. 또한 브라우저가 요청 헤더에 정보를 보내지 않으면이 정보를 얻을 수 없을 수도 있습니다. 즉, 일부 사용자는 단순히 투표하지 않을 수 있습니다 ... 또한 IP는 스푸핑 될 수 있습니다.

또 다른 가능성은 쿠키를 사용하는 것이지만, 쿠키 또는 스크립트 히트를 삭제하여 특정 콘텐츠에 대한 투표를 급상승시키려는 사용자로부터 남용을 유도한다고 생각합니다. 여기서 user-agent를 확인하는 것이 도움이되지만 스크립트를 통해 사용자 에이전트를 쉽게 위장 할 수 있습니다.

아마도 완벽한 해결책은 없지만 다른 사람들이이 문제에 어떻게 접근했는지 궁금합니다. 나는. 해커 뉴스 및 심지어 stackoverflow.

+0

CAPTCHA (스크립트 투표를 중지하기 위해)와 쿠키를 사용하는 방법과 IP 당 투표 수 1 회 대신 해당 IP에 대해 여러 번 투표 할 수있는 시간 제한을 설정하는 방법은 어떻습니까? 즉, 사람들은 여전히 ​​쿠키를 삭제하여 여러 번 투표 할 수 있지만 수동으로 (즉, 스크립트로 작성하지 않아야 함) 필요하며 X 분마다 투표 할 수 있습니다. 이것은 대부분의 사람들을 (나는 생각한다) 억제해야한다. – JonoW