Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何求多对多值的和?_Ruby On Rails_Ruby_Ruby On Rails 3_Ruby On Rails 3.1_Collect - Fatal编程技术网

Ruby on rails 如何求多对多值的和?

Ruby on rails 如何求多对多值的和?,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-3.1,collect,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 3.1,Collect,每个用户可以有很多资源,每个资源都有很多投票,每个投票都有一个value属性,我想将所有特定用户资源相加 如果我用一种语法错误的方式输入这个,我想要像 @user.resources.vows.sum(&:value),但这显然行不通 我相信我需要使用收集,但我不确定 这是我得到的最接近的但它打印出来了 对于总金额来说,这应该是有效的,或者是真正接近的 sum = 0 @user.resources.each do |r| r.votes.each do |v| sum += v.val

每个用户可以有很多资源,每个资源都有很多投票,每个投票都有一个value属性,我想将所有特定用户资源相加

如果我用一种语法错误的方式输入这个,我想要像

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

我相信我需要使用
收集
,但我不确定

这是我得到的最接近的但它打印出来了


对于总金额来说,这应该是有效的,或者是真正接近的

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中这样做可能就可以了,总的来说,这应该是可行的,或者是非常接近的

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中这样做可能就可以了

我建议在用户和投票对象之间建立一个
has\u 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
class用户:资源
结束
类资源
完成此操作后,您只需调用
user.vots
,即可对该集合执行任何操作


有关
has\u many:through
关系的更多信息,请参阅本指南:

我建议在用户和投票对象之间设置
has\u 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
class用户:资源
结束
类资源
完成此操作后,您只需调用
user.vots
,即可对该集合执行任何操作

有关
的更多信息:通过
关系,请参阅本指南:

尝试此代码

@user.resources.map(&:votes).flatten.map(&:value).sum
试试这个代码

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

通过投票实例,你如何判断谁投了票?您的投票模型必须具有
投票者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.voces
(如David Underwood所建议的)将为您提供@user resources'投票。和
@user。提交的_投票将给您@user提交的投票


使用just User如何通过一个投票实例判断谁投了票?您的投票模型必须具有
投票者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.voces
(如David Underwood所建议的)将为您提供@user resources'投票。和
@user。提交的_投票将给您@user提交的投票


只使用可以工作的用户,但我正试图将其全部放在一行中,理想情况下使用某种过程,只是为了保持代码的这部分干净,这将工作,但我正试图将其全部放在一行中,理想情况下使用某种过程,只是为了保持代码的这部分干净有效,但可能会对调用的SQL造成灾难,不?有效,但可能是灾难性的,不?很抱歉搞混了,我不确定你说的话是否仍然适用。我确实有关系,但我正在尝试统计用户提交的所有资源的所有“全局”投票(其他人对该人员资源的所有投票)。如果我做了User.voces,它只统计那个人所做的投票。为避免混淆,我不确定你所说的是否仍然适用。我确实有关系,但我正在尝试统计用户提交的所有资源的所有“全局”投票(其他人对该人员资源的所有投票)。如果我做User.voces,它只计算该人创建的投票。对不起,我不明白你的意思。我想做的基本上是sum=0@user.resources.each do{| resource | sum+=resource.voates.sum(&:value)}这段代码可以工作,但太长了,我只想把它全部写在一行如果你有正确指定的关系,那么你就可以通过
@user.voates.sum(:value)
来计算你的总和。这不是只能找到用户id为@user的投票吗?[无法编辑,必须重新创建。你的评论太快了,所以在发布我的评论后,我意识到你发布了2]每个用户…都有很多投票权--这在你的问题中并不清楚!我建议做同样的事情!现在我看得更清楚了。看起来你需要:
User.find(1).resources.joins(:voces.sum('voces.value'))
。对不起,我不明白你的意思。我想做的基本上是sum=0;@user.resources.each do{resource | sum+=resource.voces.sum(&:value)}这段代码可以工作,但太长了,我只想把它全部写在一行。如果你有正确指定的关系,那么你就可以通过
@user.voces.sum来计算你的总和(:value)
。这不是只能找到用户id为@user的投票吗?[无法编辑,必须重新创建。你的评论太快了,所以在发布我的评论后,我意识到你发布了2]每个用户…都有很多投票权--这在你的问题中并不清楚!我建议做同样的事情!现在我看得更清楚了。看起来你需要:
User.find(1).resources.joins(:voces.sum('voces.value')