Rails以每个用户不同的投票权重轮询用户

我正在创建一个民意调查应用。 我正在修改此https://www.sitepoint.com/polling-users-rails/以满足我的需求。

用户回答民意调查并显示结果。

polls t.string :question t.text :description t.references :division, foreign_key: true t.date :open_date t.date :close_date vote_options t.string :title t.references :poll, foreign_key: true votes t.references :user, foreign_key: true t.references :vote_option, foreign_key: true users t.string :email t.decimal :vote_weight 

user.rb

 class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable has_many :votes, dependent: :destroy has_many :vote_options, through: :votes def voted_for?(poll) vote_options.any? {|v| v.poll == poll } end end 

vote_option.rb

 class VoteOption < ApplicationRecord belongs_to :poll validates :question, presence: true has_many :users, has_many :votes, dependent: :destroy def get_vote_count VoteOption.joins(:votes).joins(:users).where(id: self.id).sum(:vote_weight) end end 

vote.rb

 class Vote < ApplicationRecord belongs_to :user belongs_to :vote_option end 

poll.helper

 def visualize_votes_for(option) content_tag :div, class: 'progress' do content_tag :div, class: 'progress-bar', style: "width: #{option.poll.normalized_votes_for(option)}%" do "#{option.votes.count}" end 

visualize_votes_for显示每个选项的总投票数。 目前,它为每个值考虑1并计算每个选项的总数。

我希望能够为每个用户设置一个vote_weight,这样就可以计算用户表中vote_weight列中指定的值而不是1。

我试过了:

 "#{sum(option.votes.user.vote_weight)}" 

但它返回:

 undefined method `user' for # 

我究竟做错了什么?

option.votes将返回一个活跃的记录集合。 请注意,它将是一个集合,而不是一个对象。 因此,在集合上调用方法user将无效,因为投票属于用户。 因此,只能在vote对象的实例上调用user方法,而不能在集合上调用。 您可以在VoteOption模型中创建方法get_vote_count

 def get_vote_count Vote.joins(:vote_option).joins(:user).where("vote_options.id = #{self.id}").sum(:vote_weight)` # Adjust singularity/plurality of objects as per the requirement end 

并且在选项对象(如option.get_vote_count使用此方法。