4
class User < ActiveRecord::Base
  has_many :views
  has_many :rates
  ...
end

class Resource < ActiveRecord::Base
  has_many :views
  has_many :rates
  ...
end

我正在研究用户在资源上花费的时间是否表明他们对资源的看法(我相信是的)。以下是一些更相关的数据:

在此处输入图像描述

现在,我需要得到一个比例。鉴于他们拥有的资源,它是支持资源的用户比例:

1) 对资源投赞成票或反对票

2) 已浏览资源至少 5 分钟

我怎样才能做到这一点?

(将在我继续尝试/寻找答案时更新这篇文章)

4

1 回答 1

1

让我们看看,也许我至少可以给你一个 SQL 查询,然后我们可以担心 ActiveRecord 化它:

SELECT resources.*, sum(case views.vote when 'up' 1 else 0 end) as up_votes, count(views.id) as total_views     
  FROM resources 
  JOIN views ON views.resource_id = resources.id
  JOIN rates ON rates.resource_id = resources.id 
    AND rates.user_id = views.user_id
  WHERE views.updated_at - views.created_at >= interval '5 minutes'
  AND views.vote IS NOT NULL
  GROUP BY resources.id

现在,我当然不能完全确定这是对的,但这可能是一个开始。然后,您可以将其分解为 ActiveRecord 形式:

@resources = Resources.
  select("resources.*, sum(case views.vote when 'up' 1 else 0 end) as up_votes, count(views.id) as total_views").
  joins("JOIN views ON views.resource_id = resources.id JOIN rates ON rates.resource_id = resources.id AND rates.user_id = views.user_id").
  where("views.updated_at - views.created_at >= interval '5 minutes' AND views.vote IS NOT NULL").
  group("GROUP BY resources.id")

up_votesand将total_views附加到每个 Resource 对象,因此您可以调用和操作它们(我发现它们由于某种原因被转换为字符串,因此您可能需要在它们.to_f上使用:

ratios = @resources.map{|r| r.up_votes.to_f/r.total_views.to_f}

select如果您希望数据库按比率或其他方式排序,您也可以在 中进行除法。

如果您实际上只是想要所有资源的比率,只需取出分组(尽管我不知道 ActiveRecord 会参与其中,除非它提供与数据库的连接)。

于 2013-05-01T05:53:13.507 回答