我正在使用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票。
用户点击a
和a
增加到6票,相同的用户返回并点击b
,a
减少回5票和{{1} }增加到4票。
我的第一个猜测是,我需要添加另一个模型,例如b
user_choice
和user_id
来跟踪之前的答案。
答案 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