sql - 棘手的 Rails ActiveRecord(SQL 是可以接受的!)查询以在两个连接表中找到给定条件的用户比例

标签 sql ruby-on-rails database ruby-on-rails-3.2

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

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

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

enter image description here

现在,我需要得到一个比例。这是给资源投票的用户比例,因为他们拥有:

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

2) 查看资源至少 5 分钟

我怎样才能做到这一点?

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

最佳答案

让我们看看,也许我至少可以给你一个 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_votestotal_views 将附加到每个 Resource 对象,因此您可以调用和操作它们(我发现它们出于某种原因被转换为字符串,所以你可能需要在 'em:

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

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

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

关于sql - 棘手的 Rails ActiveRecord(SQL 是可以接受的!)查询以在两个连接表中找到给定条件的用户比例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16310687/

相关文章:

mysql - sql - 将值从一列转移到另一列(单独的数据库)

ruby-on-rails - ActiveAdmin 在重命名的资源上设置 Permit_params

MySQL COUNT 和 GROUP BY 子查询

php - Laravel Eloquent 获取按天分组的结果

ruby-on-rails - rails : assets not precompiling on Capistrano deploy step due to missing variables

php - 将 $db 对象传递给其他类,以便它们可以访问数据库

database - 如何正确建模 N :N:1 ternary relationship?

mysql - 在mysql中的case语句中设置变量

SQL Server 根据两个表中的组合键自动删除 FK 记录?

ruby-on-rails - 我可以在 Rails 服务中运行 Kiba 作业吗?