[英]Tricky Rails ActiveRecord (SQL is acceptable!) query to find a proportion of users given conditions in two join tables
class User < ActiveRecord::Base
has_many :views
has_many :rates
...
end
class Resource < ActiveRecord::Base
has_many :views
has_many :rates
...
end
我正在研究用戶花在資源上的時間是否表明他們對資源的看法(我相信它是)。 這是一些更相關的數據:
現在,我需要得到一個比例。 用戶贊助資源GIVEN的比例是:
1)在資源上向上或向下投票
2)已查看資源至少5分鍾
我怎樣才能做到這一點?
(將繼續嘗試/掙扎於答案時更新此帖子)
讓我們看看,也許我至少可以得到一個SQL查詢,然后我們可以擔心ActiveRecord-izing它:
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_votes
和total_views
將附加到每個Resource對象,因此您可以調用和操作它們(我發現它們由於某種原因被轉換為字符串,因此您可能需要在.to_f
上使用.to_f
:
ratios = @resources.map{|r| r.up_votes.to_f/r.total_views.to_f}
如果您希望數據庫按比率或某些比例排序,您也可以在select
進行除法。
如果您實際上只想要所有資源的比率,只需取出分組(雖然我不知道ActiveRecord會涉及到那里,除非它提供與數據庫的連接)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.