2012-10-01 37 views
0

這裏上課,我需要收集一些統計信息很喜歡,評論,內容,瀏覽活動記錄搜索條件重複 - 如何避免這種情況?

class UsersActivityTable 

    def initialize(user_ids, content_ids, start_date, end_date) 
    @user_ids, @content_ids, @start_date, @end_date = user_ids, content_ids, start_date, end_date 
    end 

    def rows 
    @rows ||= @user_ids.map do |user_id| 
       OpenStruct.new(:full_name => sum_users(user_id), 
           :contributed => sum_contributed(user_id), 
           :interacted => sum_interacted(user_id) 
          ) 
       end 
    end 

    private 

    def sum_users(user_id) 
    @sum_users ||= Hash[ User.value_of(:id, :first_name, :last_name).map{|usr| [usr[0], "#{usr[1]} #{usr[2]}"] } ] 
    @sum_users[user_id] 
    end 

    def sum_contributed(user_id) 
    @sum_contributed ||= Content.where(:user_id => @user_ids, :id => @content_ids) 
           .where('date(created_at) between ? and ? ', @start_date, @end_date) 
           .group(:user_id) 
           .count 
    @sum_contributed[user_id].to_i 
    end 

    def sum_interacted(user_id) 
    sum_comments(user_id).to_i + sum_views(user_id).to_i + sum_likes(user_id).to_i 
    end 

    def sum_comments(user_id) 
    @sum_comments ||= Comment.where(:user_id => @user_ids, :content_id => @content_ids) 
          .where('date(created_at) between ? and ? ', @start_date, @end_date) 
          .group(:user_id) 
          .count 
    @sum_comments[user_id] 
    end 

    def sum_likes(user_id) 
    @sum_likes ||= Like.where(:user_id => @user_ids, :content_id => @content_ids) 
         .where('date(created_at) between ? and ? ', @start_date, @end_date) 
         .group(:user_id) 
         .count 
    @sum_likes[user_id] 
    end 

    def sum_views(user_id) 
    @sum_views ||= View.where(:viewable_type => 'Content', :user_id => @user_ids, :viewable_id => @content_ids) 
         .where('date(created_at) between ? and ? ', @start_date, @end_date) 
         .group(:user_id) 
         .count 
    @sum_views[user_id] 
    end 
end 

正如你可以看到有一些重複:

.where('date(created_at) between ? and ? ', @start_date, @end_date) 
.group(:user_id) 
.count 

我執行它爲每一個實體。 有什麼辦法可以應用條件lambda或什麼?

我認爲是可能的 - 是在集合實例定義方法,並調用它:有時候

# pseudo code 
group_results = lambda{|el| el.where('date(created_at) between ? and ? ', @start_date, @end_date) 
          .group(:user_id) 
          .count } 
Content.where(...).tap{|collection| collection.defune_method .... }.group_results 

回答

1

爲不平凡的統計,一個的find_by_sql返回你想要的一切是更有效率,甚至可能頭髮比複雜的紅寶石更清晰

YMMV當然:)

相關問題