每个用户可以有很多资源,每个资源都有很多投票,每个投票都有一个价值属性,我想总结所有特定用户的资源。
如果我以语法不正确的方式输入它,我想要类似...
@user.resources.votes.sum(&:value)
,但这显然行不通。
我相信我需要使用collect
但我不确定?
这是我得到的最接近的,但它会打印出来,呵呵
<%= @user.resources.collect { |r| r.votes.sum(&:value) } %>
每个用户可以有很多资源,每个资源都有很多投票,每个投票都有一个价值属性,我想总结所有特定用户的资源。
如果我以语法不正确的方式输入它,我想要类似...
@user.resources.votes.sum(&:value)
,但这显然行不通。
我相信我需要使用collect
但我不确定?
这是我得到的最接近的,但它会打印出来,呵呵
<%= @user.resources.collect { |r| r.votes.sum(&:value) } %>
我建议has_many :through
在 User 和 Vote 对象之间建立关系。像这样设置模型:
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
你怎么知道谁投票有一个 Vote 实例?您的投票模型必须具有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
(正如大卫安德伍德所提议的)会给你@user 资源的投票。并且@user.submited_votes
会给你@user提交的投票。
仅使用 User <- Resource <- Vote 关系将不允许您将他的某些用户投票和对其资源的投票分开。
总而言之,这应该有效或真正接近。
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 中这样做可能就可以了
试试这个代码
@user.resources.map(&:votes).flatten.map(&:value).sum