在同一模型中的其他方法中重用相同的对象

时间:2012-11-29 15:05:14

标签: ruby-on-rails

使用Rails 3.2。我有以下代码:

# photo.rb
class Photo < ActiveRecord::Base
  before_create :associate_current_user
  after_save :increase_user_photos_count
  after_destroy :decrease_user_photos_count

  private

  def associate_current_user
    current_user = UserSession.find.user
    self.user_id = current_user.id
  end

  def increase_user_photos_count
    current_user = UserSession.find.user
    User.increment_counter(:photos_count, current_user.id)
  end

  def decrease_user_photos_count
    current_user = UserSession.find.user
    User.decrement_counter(:photos_count, current_user.id)
  end
end

在创建新记录之前,它会搜索current_user。如果它一次只有1个新记录,那就没关系。但如果要创建100条记录,它将搜索相同的current_user 100次。肯定存在性能问题。

  1. 我不想让它在每次创建记录/ photos_count更新等时继续找到当前用户。
  2. 重构后,是否会影响同时使用其帐户上传照片的其他用户?
  3. 注意:由于某些原因,我无法使用counter_cachephotos_controller.rb因为我遵循此示例:http://www.tkalin.com/blog_posts/multiple-file-upload-with-rails-3-2-paperclip-html5-and-no-javascript

    感谢。

1 个答案:

答案 0 :(得分:3)

使用此

def current_user
  @current_user ||= UserSession.find.user
end

这将缓存实例变量@current_user中的值,除非它是nil(在请求中第一次),在这种情况下它将设置它。