Sí, esto es posible. Puede usar papreclip para administrar las cargas de archivos (o cualquier otro plugin/gema de carga de buena reputación). La mayoría de estas herramientas le dan acceso al tamaño de archivo del archivo cargado. Simplemente puede almacenar estos archivos en la base de datos junto con el asset_uri (que imagino que ya está almacenando), y para verificar si un usuario puede cargar otro archivo, simplemente sume todos los tamaños de todos los activos con el user_id apropiado.
Users:
id
email_address
first_name
upload_limit
Assets:
id
user_id
uri
filesize
filename
Entonces, para agarrar el tamaño total de los archivos cargados por un usuario en particular, se puede hacer:
class User < ActiveRecord::Base
has_many :assets
#Check if the user can upload another file
def can_upload?
if Asset.sum('filesize', :conditions => 'user_id = #{self.id}') >= self.upload_limit
return false
else
return true
end
end
#See the user's used storage space
def used_storage
return Asset.sum('filesize', :conditions => 'user_id = #{self.id}')
end
#See how much space the user has remaining
def available_storage
if self.can_upload?
return self.upload_limit - Asset.sum('filesize', :conditions => 'user_id = #{self.id}')
else
return 0
end
end
end
Se puede ver que estoy haciendo uso de la función ActiveRecord sum aquí para hacer el cálculo . También podría usar fácilmente un mapa o alguna otra solución basada en ruby.