2016-06-13 3 views
0

Я довольно новичок в 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 

Теперь сфера я ВГА e в модели «Голосование» проверяют только уникальность выбора (я могу голосовать только за этот выбор один раз), но я все еще могу голосовать за другие варианты в том же вопросе. Я хотел бы иметь возможность голосовать в вопросе один раз. Таким образом, вопрос и выбор уникальны. Я думаю, мне нужно создать настраиваемую область, но я не знаю, как это сделать.

ответ

0

Поскольку вы не показывали свои контроллеры/виды или схему, я сделал некоторые предположения, чтобы указать вам в правильном направлении. Вы можете написать пользовательскую проверку в модели Vote.rb следующим образом:. (Im предполагая, когда вы разыгрываете голос его направляющее идентификатор пользователя, его выбор, и вопрос выбора принадлежит

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 Я думаю, что вам не хватает цитаты после второго вопросительного знака и перед запятой – Dan

+0

Это для меня. Должна иметь возможность просто скопировать и вставить его. – bkunzi01

Смежные вопросы