簡體   English   中英

Tricky Rails ActiveRecord(SQL是可以接受的!)查詢在兩個連接表中查找給定條件的用戶比例

[英]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_votestotal_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM