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.