0

What I would like to happen is every single time a new file is uploaded, user.space_used is updated.

But that doesn't happen right now. In order to get an update, I have to manually run user.update_space at the console to update a specific user, or use an array to cycle through all the users and update it like that.

How do I get it to do it at the right time - also, it would be nice if I could verify that the space_used column on the User model has the total sum of the filesizes of all the files uploaded for that user on the Upload model.

My user model looks like this:

# == Schema Information
# Schema version: 20110412170916
#
# Table name: users
#
#  id                   :integer         not null, primary key
#  email                :string(255)
#  encrypted_password   :string(128)
#  password_salt        :string(255)
#  reset_password_token :string(255)
#  remember_token       :string(255)
#  remember_created_at  :datetime
#  sign_in_count        :integer
#  current_sign_in_at   :datetime
#  last_sign_in_at      :datetime
#  current_sign_in_ip   :string(255)
#  last_sign_in_ip      :string(255)
#  username             :string(255)
#  first_name           :string(255)
#  last_name            :string(255)
#  created_at           :datetime
#  updated_at           :datetime
#  invitation_token     :string(60)
#  invitation_sent_at   :datetime
#  plan_id              :integer
#  current_state        :string(255)
#  confirmation_token   :string(255)
#  confirmed_at         :datetime
#  confirmation_sent_at :datetime
#  space_used           :integer         default(0), not null
#  failed_attempts      :integer         default(0)
#  unlock_token         :string(255)
#  locked_at            :datetime
#  trial_end_date       :date
#  active_subscription  :boolean
#

class User < ActiveRecord::Base
    acts_as_voter
  devise :database_authenticatable, :confirmable, :registerable, :timeoutable,
         :recoverable, :rememberable, :trackable, :validatable, :invitable, :lockable

  attr_accessible :email, :password, :password_confirmation, :remember_me, :username, :first_name, :last_name, :plan_id

    after_save  :update_space

  def role_symbols
    roles.map do |role|
      role.name.underscore.to_sym
    end
  end

  def update_space
       total_size = 0
         if self.uploads.count > 0
           self.uploads.each do |upload|
             total_size += upload[:image_file_size]
           end
         end
    self.space_used = total_size

  end

    def space_threshold_reached?
        self.plan.storage == self.space_used        
    end

    def space_left
        (self.plan.storage * 1024 * 1024 * 1024) - self.space_used.to_f     
    end


end

My Upload model looks like this:

# == Schema Information
# Schema version: 20110330215959
#
# Table name: uploads
#
#  id                 :integer         not null, primary key
#  name               :string(255)
#  description        :string(255)
#  image_file_name    :string(255)
#  image_content_type :string(255)
#  image_file_size    :integer
#  image_updated_at   :datetime
#  stage_id           :integer
#  user_id            :integer
#  created_at         :datetime
#  updated_at         :datetime

class Upload < ActiveRecord::Base
    acts_as_voteable
    has_attached_file :image, :styles => { 
                                                                :thumb => "64x64" },
                                                            :storage => :s3,
                                                            :path => "/:style/:id/:filename"

    validates_attachment_presence :image                    
  validates_attachment_size :image, :less_than => 10.megabytes
  validates_attachment_content_type :image, :content_type => ['image/jpeg', 'image/png', 'image/gif', 'image/jpg', 'image/JPG']

    after_post_process :update_users_space_used

    def self.total_used
        total_size = 0
        all.each do |upload|
            total_size += upload.image_file_size
        end
        return total_size
    end

    def update_users_space_used
        Authorization.current_user.space_used += self.image_file_size       
    end


end

Thanks.

Edit1: Btw, I am using paperclip to manage the uploads.

Edit2: In the Upload.rb model, I changed the before_save to the after_post_process callback for paperclip and it still doesn't work.

marcamillion
  • 32,933
  • 55
  • 189
  • 380

1 Answers1

1

Seems like Paperclip's after_post_process callback would be what you want.

carpeliam
  • 6,691
  • 2
  • 38
  • 42