如何使用ruby on rails创建对多选应用程序的投票

时间:2014-01-30 04:18:42

标签: ruby-on-rails ruby voting

我正在使用Ruby on Rails开发一个多项选择题和答案应用程序,我有以下模型。

class User < ActiveRecord::Base
  has_many :questions
end  

class Question < ActiveRecord::Base
  belongs_to :user
  has_many :answers
end

class Answer < ActiveRecord::Base
  belongs_to :question
  has_many :votes
end

class Vote < ActiveRecord::Base
  belongs_to :user
  belongs_to :answer
end

我的问题是用户可以选择所有答案。

如何修复它以便更新到新答案?

例如,a有5票,b 3票。

用户点击aa增加到6票,相同的用户返回并点击ba减少回5票和{{1} }增加到4票。

我的第一个猜测是,我需要添加另一个模型,例如b user_choiceuser_id来跟踪之前的答案。

1 个答案:

答案 0 :(得分:2)

你在模特中有答案。只需在问题模型中添加一个点系统。

在问题模型下,

def points
  self.answers.count
end

或者,如果答案附加了不同的值,则将点作为答案实例的属性。

def points
  self.answers.pluck(:points).inject(:+)
end

这将总结属于问题的答案中的所有点,这样您就可以按点数排序问题。

但是,我假设您需要一个问题的选择模型,除非这实际上是投票的目的。

问题has_many选择

选择属于问题等等。

当你说:

时,我不确定你的意思
  

如何修复它以便更新到新答案?

修改

呃,好的,所以你只需要我之前提到的。投票实际上只是选择答案的次数。

如果你的问题是用户可以选择多个答案,你可能应该通过javascript实现基于视图的验证,或者更好的是,只是禁用他们选择多个选项的能力,如果你使用的是选择标签,实际上是默认的。您必须已添加

multiple: true

在select标签选项中供用户选择多个条目。

在后端,你可以这样做:

class Choice < ActiveRecord::Base
validates_uniqueness_of :user_id, scope: [:question_id, :answer_id]
end