gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:57:49 27 4
gpt4 key购买 nike

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com