0

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
4

1 に答える 1

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

クエリでマイナスを実行できるかどうかはわかりませんが、それがなくても実行する方が良い方法です

于 2013-03-03T00:13:13.447 に答える