2016-06-13 4 views
0

Ich bin ziemlich neu in Rails. Ich versuche ein Wahlsystem zu schaffen, bei dem die Leute in einer Frage eine Antwort wählen können.Scoping für verschachtelte atrributes rails 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 

nun der Umfang I hav e im "Vote" -Modell überprüfe nur die Eindeutigkeit einer Auswahl (ich kann nur einmal für diese Wahl stimmen), aber ich kann immer noch für andere Entscheidungen in der gleichen Frage stimmen. Ich würde gerne einmal in einer Frage abstimmen können. Also die Frage und die Wahl ist einzigartig. Ich denke, ich muss einen benutzerdefinierten Bereich erstellen, aber ich weiß nicht wie.

Antwort

0

Da Sie Ihre Controller/Ansichten oder Ihr Schema nicht gezeigt haben, habe ich einige Annahmen gemacht, um Sie in die richtige Richtung zu weisen. Sie können eine benutzerdefinierte Validierung in Ihrem Vote.rb-Modell wie folgt schreiben: (Ich nehme an, wenn Sie eine Stimme abgeben, sendet es die ID des Benutzers, seine Wahl und die Frage, der die Wahl gehört.

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

Hey, danke Ich habe es anders gelöst, aber Ihr Vorschlag hat mich definitiv in die richtige Richtung gelenkt. Ich habe gerade eine Frage-Spalte für Vote erstellt. Dann kann ich einfach die Frage-ID-Eindeutigkeit definieren. –

+0

@ bkunzi01 Ich glaube, Sie vermissen ein Zitat nach dem 2. Fragezeichen und vor dem Komma. – Dan

+0

Es ist für mich da. Sollte in der Lage sein, es einfach zu kopieren und einzufügen. – bkunzi01