2012-07-20 51 views
0

鑑於以下數據庫模式和Sequel模型,我如何選擇一組節點按其命中相加的一組節點,同時保留結果作爲具有所有數據和工作方法的模型實例檢索具有統計數據的模型

Sequel.migration{ change{ 
    create_table :nodes do 
    primary_key :id 
    String  :name 
    # other columns 
    end 

    create_table :node_hits do 
    foreign_key :node_id, :nodes, null:false 
    Date  :date, null:false 
    Integer  :hits, null:false 
    primary_key [:node_id,:date] 
    end 
end 

class Node < Sequel::Model 
    one_to_many :node_hits 
    def is_awesome? 
    # use data known about the node 
    end 
end 

class NodeHit < Sequel::Model 
    many_to_one :node 
end 

下面的代碼會出現在「工作」,但未能確實有正常工作所需Node.is_awesome?方法的特性(由於缺少有關的節點數據):

base = Node.filter(redacted:false) 
recent = base.join(:node_hits,node_id: :id).filter{ date>Date.today-7 } 
totals = recent.select_more{[ id, sum(hits)as(hits) ]}.group_by(:id) 

puts totals.sql 
#=> SELECT "id", sum("hits") AS "hits" 
#=> FROM "nodes" 
#=> INNER JOIN "node_hits" ON ("node_hits"."node_id" = "nodes"."id") 
#=> WHERE (("name" != 'phrogz') 
#=>  AND ("archived" IS FALSE) 
#=>  AND ("date" > '2012-07-13')) 
#=> GROUP BY "id" 

totals.all.first.is_awesome? 
#=> Error: `name` is nil for the Node instance. 

哪有我獲取續集通常爲模型獲取的任何字段?

我的最終需求是根據上週內點擊總數以及該周的點擊次數得到前N個節點,同時允許節點實例功能全面(支持所有已知數據爲一個節點)。

回答

2

您需要從節點表中選擇所有列。這是我會用的:

totals = Node.filter(redacted:false). 
    select_all(:nodes). 
    select_more{sum(hits).as(hits)}. 
    group(:nodes__id). 
    join(:node_hits, node_id: :id). 
    filter{ date>Date.today-7 } 
+0

啊,'select_all(:nodes)'是神奇的。謝謝! – Phrogz 2012-07-20 15:59:47