我如何总结多对多的价值?

时间:2012-05-14 04:28:42

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1 collect

每个用户可以拥有许多资源,每个资源都有很多投票,每个投票都有一个值属性,我希望将所有特定用户资源加起来。

如果我以语法不正确的方式键入它,我想要类似......

@user.resources.votes.sum(&:value),但这显然不起作用。

我相信我需要使用collect,但我不确定?

这是我得到的最接近但是打印出来的,呵呵

<%= @user.resources.collect { |r| r.votes.sum(&:value) } %>

4 个答案:

答案 0 :(得分:3)

我建议在User和Vote对象之间设置has_many :through关系。像这样设置模型:

class User < ActiveRecord::Base
  has_many :resources
  has_many :votes, :through => :resources
end

class Resource < ActiveRecord::Base
  belongs_to :user
  has_many :votes
end

class Vote < ActiveRecord::Base
  belongs_to :resource
end

完成此操作后,您只需致电user.votes并随意为该集合做任何事情。

有关has_many :through关系的详情,请参阅本指南:http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association

答案 1 :(得分:2)

你怎么知道谁投票了投票实例?您的投票模型必须具有voter_id字段和其他关联:

# in Vote.rb
belongs_to :voter, class_name: 'User', foreign_key: 'voter_id'

在您的用户模型中:

# in User.rb
has_may :submited_votes, class_name: 'Vote', foreign_key: 'voter_id'

所以,@user.votes(正如David Underwood所建议的那样)会给你@user resources'投票。 @user.submited_votes将为您提供@user提交的投票。

仅使用用户&lt; - 资源&lt; - 投票关系将不允许您将他所做的一些用户的投票和对其资源的投票分开。

答案 2 :(得分:1)

总和这个应该有效或者真正接近。

sum = 0
@user.resources.each do |r|
r.votes.each do |v|
    sum += v.value
end
end

这可能对您有用:

@user.resources.map {|r| r.votes.sum(:value)}.sum

你有多少条记录,有一种方法可以把它推到数据库级别我相信,我必须检查,但如果它只是几条记录那么在ruby中这样做可能会没问题

答案 3 :(得分:1)

试试此代码

@user.resources.map(&:votes).flatten.map(&:value).sum