2016-06-13 11 views
0

私はRailsでかなり新しいです。私は人々が質問で1つの答えを投票できる投票システムを作成しようとしています。ネストされたアトリビュート・レールのスコープ4

Question.rb

has_many :choices, dependent: :destroy 

accepts_nested_attributes_for :choices, reject_if: proc { |attributes| attributes['option'].blank?}, allow_destroy: true 

validates_presence_of :title, :user_id 

Choice.rb

belongs_to :question 
has_many :votes, dependent: :destroy 

Vote.rb

belongs_to :voter, class_name: 'User' 
belongs_to :choice 

validates_presence_of :voter_id, :choice_id 
validates_uniqueness_of :voter, scope: :choice 

私は肝炎スコープ「投票」モデルのeは選択肢の一意性のみをチェックします(私はその選択肢に対して1回しか投票できません)が、同じ質問で他の選択肢に投票することができます。私は一度質問で投票できるようにしたいと思います。したがって、質問と選択はユニークです。私はカスタムスコープを作成する必要があると思いますが、私はどのようにして分かりません。

答えて

0

コントローラ/ビューまたはスキーマを表示していないので、私はあなたに正しい方向を向けるいくつかの前提を設定しました。 Vote.rbモデルでは、次のようにカスタム検証を書くことができます。(投票したときに、ユーザーのID、選択肢、選択肢の質問を送信していることを前提とします)

validate :one_vote_per_question 

#self is in the 'vote' context so assuming you followed standard rails practices: 
def one_vote_per_question 
    if Vote.where("voter_id = ? AND question_id = ?", self.voter.id, self.choice.question.id).exists? 
    errors.add(:vote, "You have already voted on this question") 
    end 
end 
+1

ありがとう私はそれを別の方法で解決しましたが、あなたの提案は間違いなく私に正しい方向を指していたと思います。投票のquestion_id列を作成した後、question_idの一意性をスコープしてみてください。 –

+0

@ bkunzi01 2番目の疑問符カンマの前に。 – Dan

+0

私のためにそこにあります。それをコピーして貼り付けることができるはずです。 – bkunzi01

関連する問題