2013-03-02 2 views
0

TL (레일 액티브 더 나은 방법을 찾고), DR :합계 created_at과 updated_at의 차이

를 그래서 나는 내가 할 그림 : 이제

@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} 

하지만 오히려 액티브 나를

편집을 위해 그것을 계산 거라고 :이처럼 작동 쓰레기, 수 없습니다 스와 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? 

UPDATE 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

어떤 데이터베이스를 사용하고 있습니까? –

+0

우리는 포스트그레스를 실행 중입니다 –

답변

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

빠른 답장을 보내 주셔서 감사합니다. 오류가 발생하여 업데이트 된 게시물의 하단에 표시됩니다. –

+0

user_resource_views로보기 바꾸기 –

+0

내 오류가 다른 것으로 변경되었습니다 (업데이트 2 참조). 아직 작업 중이므로 도움을 주셔서 감사합니다! –