每个用户可以拥有许多资源,每个资源都有很多投票,每个投票都有一个值属性,我希望将所有特定用户资源加起来。
如果我以语法不正确的方式键入它,我想要类似......
@user.resources.votes.sum(&:value)
,但这显然不起作用。
我相信我需要使用collect
,但我不确定?
这是我得到的最接近但是打印出来的,呵呵
<%= @user.resources.collect { |r| r.votes.sum(&:value) } %>
答案 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