What I would like to happen is every single time a new file is uploaded, user.space_used
is updated.
我希望发生的是每次上传一个新文件时,用户。space_used更新。
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.
但这种情况现在还没有发生。为了获得更新,我必须手动运行用户。控制台的update_space用于更新特定的用户,或者使用一个数组循环遍历所有的用户并像这样更新它。
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.
如何让它在正确的时间完成它呢?另外,如果我能验证用户模型上的space_used列拥有上传模型上所有用户上传的文件的总和,那就太好了。
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.
顺便说一句,我正在使用paperclip管理上传。
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.
Edit2:在上传。rb模型,我将before_save更改为paperclip的after_post_process回调,它仍然不起作用。
1 个解决方案
#1
1
Seems like Paperclip's after_post_process
callback would be what you want.
似乎Paperclip的after_post_process回调是您想要的。
#1
1
Seems like Paperclip's after_post_process
callback would be what you want.
似乎Paperclip的after_post_process回调是您想要的。