【问题标题】:Sum the difference between created_at and updated_at (Rails ActiveRecord - Looking for a better way)总结 created_at 和 updated_at 之间的差异(Rails ActiveRecord - 寻找更好的方法)
【发布时间】:2013-03-03 09:29:30
【问题描述】:

TL;DR:

所以我想我会的:

@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 为我计算它

编辑:废话,显然不能对时间戳求和,需要就地计算差异

有没有更好的方法来做到这一点?我在正确的轨道上吗? (我会不断试验和更新这篇文章,直到我弄明白为止)

详情:

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

它具有标准时间戳: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

更新:

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

【问题讨论】:

  • 你用的是什么数据库?
  • 我们正在运行 postgres

标签: ruby-on-rails ruby activerecord


【解决方案1】:

这应该可以工作并最大限度地减少查询

@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') 

我不确定您是否可以对查询进行减号,但仍然没有,这是一种更好的方法

【讨论】:

  • 感谢您的快速回复。我收到一个错误,显示在我更新后的帖子底部
  • 用 user_resource_views 替换视图
  • 将我的错误更改为其他内容(请参阅更新 2)。仍在努力,感谢您的帮助!
  • 我可以让它像这样工作:r = Resource.first; time_sum_difference = r.views.sum {|v| v.updated_at.to_i - v.created_at.to_i} 耸耸肩
猜你喜欢
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
相关资源
最近更新 更多