如何让每个用户帐户的存储在上传到Rails 3中的新文件时更新?

时间:2021-04-08 07:26:01

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回调是您想要的。