Проверьте, проголосовал ли пользователь с областью действия
Я использую акты с правом голоса для проведения веб-опроса. С двумя вариантами просто определить, проголосовал ли пользователь или нет.
@user.likes @comment1
@user.up_votes @comment2
# user has not voted on @comment3
@user.voted_for? @comment1 # => true
@user.voted_for? @comment2 # => true
@user.voted_for? @comment3 # => false
@user.voted_as_when_voted_for @comment1 # => true, user liked it
@user.voted_as_when_voted_for @comment2 # => false, user didnt like it
@user.voted_as_when_voted_for @comment3 # => nil, user has yet to vote
https://github.com/ryanto/acts_as_votable
Мне нужно иметь несколько вариантов на выбор и реализовать их на основе этого: Как настроить систему голосования с несколькими вариантами, используя акты как голосование?
Приведенный выше пункт гласит, что вы можете проверить, голосовал ли пользователь с помощью voted_for? однако это включает в себя элементы с областью видимости:
Poll.first.vote_by voter: User.first, vote_scope: 'blue'
User.first.voted_for? Poll.first #false
User.first.voted_for? Poll.first, :vote_scope => 'blue' #true
Мой вопрос заключается в том, каков наилучший способ определить, проголосовал ли пользователь при использовании областей? Нужно ли проходить и проверять каждую область отдельно для каждой записи?
Редактировать 1
В настоящее время у меня есть следующий метод экземпляра опроса:
def has_voted?(user)
['red', 'green', 'blue', 'white'].each do |option|
if user.voted_for? self, :vote_scope => option
return true
end
end
return false
end
Poll.first.has_voted?(User.first)
1 ответ
Похоже, вы должны быть в состоянии позвонить Poll.first.votes_for
и получите список голосов, которые были отданы:
p.votes_for
=> #<ActiveRecord::Associations::CollectionProxy [#<ActsAsVotable::Vote id: 1,
votable_type: "Poll", votable_id: 1, voter_type: "User", voter_id: 1, vote_flag: true,
vote_scope: "blue", vote_weight: 1,
created_at: "2017-11-05 22:12:52", updated_at: "2017-11-05 22:12:52">]>
С этим списком вы сможете проверить, voter_ids
соответствует User
ты ищешь:
p.votes_for.any? { |v| v.voter_id == u.id }
=> true