1

每个用户可以有很多资源,每个资源都有很多投票,每个投票都有一个价值属性,我想总结所有特定用户的资源。

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

@user.resources.votes.sum(&:value),但这显然行不通。

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

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

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

4

4 回答 4

3

我建议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

于 2012-05-14T05:01:27.203 回答
2

你怎么知道谁投票有一个 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 关系将不允许您将他的某些用户投票和对其资源的投票分开。

于 2012-05-14T06:58:25.923 回答
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​​ 中这样做可能就可以了

于 2012-05-14T04:35:22.780 回答
1

试试这个代码

@user.resources.map(&:votes).flatten.map(&:value).sum
于 2012-05-14T05:09:06.937 回答