2013-03-02 37 views
0

TL; DR:总和created_at和的updated_at之间的差异(Rails的ActiveRecord的 - 寻找一种更好的方式)

所以我想我做的:

@user.resources.each do |r| 
    #Something like this... 
    r.views.sum(:created_at, :group=>:resource_id) - r.views.sum(:updated_at, :group=>:resource_id) 
end 

现在,我知道我能得到它这样的工作:

r = Resource.first 
time_sum_difference = r.views.sum {|v| v.updated_at.to_i - v.created_at.to_i} 

但我宁愿ActiveRecord的计算的话,我

编辑:废话,不能苏m时间戳显然需要计算差异

有没有更好的方法来做到这一点?我在正确的轨道上吗? (我会尝试,直到我弄明白更新这个帖子)

详情:

我有一个视图模型是资源和用户之间的连接表。

它拥有标准时间戳:created_at和的updated_at

我想获得的花费在用户提交的资源的时间的总和。

在我的资源模型:

has_many :views, :class_name => 'UserResourceView' 

那么对于查看:

class UserResourceView < ActiveRecord::Base 
    attr_accessible :resource_id, :user_id 
    belongs_to :resource 
    belongs_to :user 
end 

和用户:

class User < ActiveRecord::Base 
    has_many :resources 
    has_many :resource_views, :class_name => 'UserResourceView' 
    has_many :viewed_resources, :through => :resource_views, :source => :resource 
... 
end 

UPDATE:

u.resources.joins(:views).group('resources.id').select('sum(views.created_at) as s_ca, sum(views.updated_at) as s_ua, s_ca - s_ua as diff').first 

    Resource Load (0.7ms) SELECT sum(views.created_at) as s_ca, sum(views.updated_at) as s_ua, s_ca - s_ua as diff FROM "resources" INNER JOIN "user_resource_views" ON "user_resource_views"."resource_id" = "resources"."id" WHERE "resources"."user_id" = 1 GROUP BY resources.id LIMIT 1 
ActiveRecord::StatementInvalid: PG::Error: ERROR: missing FROM-clause entry for table "views" 

LINE 1: SELECT sum(views.created_at) as s_ca, sum(views.updated_at)... 
        ^
: SELECT sum(views.created_at) as s_ca, sum(views.updated_at) as s_ua, s_ca - s_ua as diff FROM "resources" INNER JOIN "user_resource_views" ON "user_resource_views"."resource_id" = "resources"."id" WHERE "resources"."user_id" = 1 GROUP BY resources.id LIMIT 1 

更新2:

u.resources.joins(:user_resource_views).group('resources.id').select('sum(user_resource_views.created_at) as s_ca, sum(user_resource_views.updated_at) as s_ua, s_ca - s_ua as diff') 
ActiveRecord::ConfigurationError: Association named 'user_resource_views' was not found; perhaps you misspelled it? 

更新3(详细信息):

从我schema.rb文件:

create_table "user_resource_views", :force => true do |t| 
    t.integer "resource_id" 
    t.integer "user_id" 
    t.datetime "created_at", :null => false 
    t.datetime "updated_at", :null => false 
    end 
+0

你使用的是什么数据库? – 2013-03-03 00:14:42

+0

我们正在运行postgres – 2013-03-03 00:19:12

回答

0

这应该工作,并尽量减少查询

@user.resources.joins(:views) 
.group('resources.id') 
.select('sum(views.created_at) as s_ca, sum(views.updated_at) as s_ua, s_ca - s_ua as diff') 

我不确定你是否可以在查询中做到这一点,但仍然没有,这是更好的方法来做到这一点

+0

感谢您的快速回复。我收到一条错误消息,我在更新后的底部显示 – 2013-03-03 00:19:43

+0

用user_resource_views替换视图 – 2013-03-03 00:55:17

+0

将我的错误更改为其他内容(请参阅更新2)。仍在努力,我感谢帮助! – 2013-03-03 01:06:37

相关问题