acquisto viagra originale sildenafil prezzo levitra viagra cialis differenze vendita cialis senza ricetta durata levitra cialis femminile viagra naturale farmacia cialis prezzo in farmacia cialis miglior prezzo viagra costa viagra generico in farmacia kamagra controindicazioni cialis pasti acquistare viagra cialis generico opinioni viagra cialis differenza cialis vendo viagra generico contrassegno cialis rosa cialis da 2 5 mg cialis generico 5mg cialis caratteristiche compra viagra generico viagra roma viagra generico funziona comprare viagra in internet viagra x le donne prezzo levitra 10 mg ordina cialis viagra female acquista cialis generico confezioni cialis cialis generico costo cialis pagamento alla consegna cialis farmacia senza ricetta viagra generico in italia erboristeria viagra naturale farmacie viagra comprare cialis su internet vendita cialis generico levitra acquisto costi cialis levitra confezioni e prezzi levitra 10 mg costo cialis pagamento contrassegno levitra prezzo vendita viagra in italia viagra naturale per donne prezzo farmacia cialis farmaco levitra cialis prescrizione medica cialis da banco levitra in farmacia medicinale levitra cialis torrino prezzo cialis 10 cialis prezzo in farmacia acquisto cialis senza ricetta cialis generico sicuro levitra vendita sildenafil dosaggio vendita cialis san marino viagra vendita libera viagra per femmine viagra generico opinioni viagra da banco cialis da banco viagra serve la ricetta comprare cialis online viagra online sicuro viagra euro prezzi viagra cialis o simili acquisto cialis in farmacia levitra 10 mg generico cialis su internet acquistare cialis generico cialis medicinale comprare cialis in contrassegno prezzo cialis generico impotenza rimedi cialis effetti collaterali viagra generico online cialis o simili cialis acquisto on line compra cialis in italia cialis benefici cialis farmaco levitra 20 mg levitra costo cialis caratteristiche acquisto cialis on line cialis 5 mg prezzo cialis san marino tadalafil principio attivo cialis comprare comprare viagra viagra costo costo cialis generico cialis costa acquisto viagra net levitra ci vuole ricetta comprare cialis a san marino levitra contrassegno viagra sostituto kamagra opinioni levitra contrassegno viagra alternativo acquisto cialis svizzera viagra per donne viagra a san marino cialis originale cialis generico opinioni cialis in contrassegno cialis vendita libera viagra prezzi in farmacia cialis pagamento paypal comprare cialis sicuro viagra quanto costa in farmacia differenze cialis viagra cialis prezzo acquisto viagra net cialis prezzo farmacia levitra costo in farmacia acquistare cialis su internet acquistare viagra in italia cialis fa bene viagra x le donne sildenafil 100 mg viagra naturale funziona cialis generico costo viagra generico in farmacia acquista levitra vendita cialis italia viagra compresse cialis costo viagra farmacie kamagra funziona offerte viagra viagra per donne viagra donna cialis al naturale dosaggio viagra prezzo viagra farmacia sildenafil generico levitra acquista levitra originale viagra sottobanco vendo cialis milano viagra fa bene viagra 100 prezzo cialis 20 mg prezzo in farmacia prescrizione cialis acquistare cialis in farmacia aquisto viagra comprare viagra svizzera cialis farmaco benefici viagra viagra cialis differenze viagra alle donne levitra farmaco prezzo tadalafil farmaci impotenza viagra e cialis differenze viagra svizzera cialis alle erbe tadalafil 10 mg cialis fa bene viagra medicinale viagra compresse cialis vendita in farmacia viagra pasti levitra 5 mg prezzo viagra senza ricetta in svizzera cialis generico 10 mg viagra costo effetti viagra sulle donne levitra costo viagra x donne levitra ricetta medica acquisto cialis acquisto levitra online cialis 10 mg cialis super active levitra informazioni sildenafil prezzo viagra meccanismo d'azione cialis controindicazioni cialis vendita in italia viagra vendita in italia viagra dogana viagra femminile naturale vendita viagra san marino costo cialis in francia levitra generico in farmacia levitra generico online acquistare cialis acquistare levitra prescrizione viagra compro levitra femminile viagra viagra informazioni vendita viagra san marino viagra torino libera vendita cialis costo levitra 10 mg vendita cialis cialis alle erbe viagra acquisto sicuro viagra prezzo farmacia viagra alle erbe viagra naturale femminile costo levitra cialis euro tadalafil farmacia viagra nelle donne vendo cialis milano curare impotenza viagra a basso costo viagra naturale in erboristeria tadalafil effetti collaterali cialis recensioni cialis italia cialis 20 mg originale viagra rosa per donne comprare viagra internet farmaci impotenza compresse levitra viagra da 25 vendo viagra milano viagra acquisto sicuro cialis originale vendita comprare viagra in farmacia comprare cialis in svizzera viagra da 25 mg viagra modalità d'uso viagra ricetta ripetibile cialis per donne prezzo viagra 50 mg female viagra femigra viagra a san marino curare impotenza viagra ricetta libera vendita cialis prezzo levitra viagra offerte vendita cialis in contrassegno cialis compresse 5 mg cialis forum al femminile generico levitra comprare levitra viagra euro acquisto levitra tadalafil generico farmacia viagra erbe viagra farmaco generico cialis torino viagra acquistare cialis generico forum cialis compresse cialis generico india cialis dosaggio tadalafil effetti collaterali dosaggio levitra levitra 5 mg prezzo sildenafil donne viagra compra viagra e simili cialis europa svizzera viagra cialis recensioni levitra medicinale prezzi cialis cialis cialis differenze farmaco cialis ordina viagra comprare cialis sicuro cialis durata effetto levitra generico cialis 5 mg quanto costa comprare viagra in svizzera viagra prezzo farmacia compra viagra online viagra dove comprarlo acquista cialis on line cialis 20 mg effetti collaterali cialis generico sicuro cialis rosa viagra da 25 acquisto viagra levitra opinioni ricetta cialis cialis senza prescrizione acquistare cialis online cialis 20 mg in farmacia acquisto viagra svizzera cialis 5 mg quanto costa cura impotenza vendita cialis generico in italia vendo cialis napoli comprare cialis originale vardenafil costo viagra cialis levitra differenze cialis roma compro viagra online viagra 100 mg prezzo viagra in farmacia viagra originale cialis medicinale cialis comprare online viagra in contrassegno tadalafil in farmacia comprare viagra senza ricetta kamagra generico viagra quanto costa in farmacia levitra da 20 svizzera viagra cialis naturale funziona viagra senza ricetta forum cialis professional vendita cialis originale acquistare viagra farmacia levitra vendita viagra contrassegno comprare cialis senza ricetta costo cialis 20 mg cialis 20 mg originale cialis 5 mg generico cialis generico funziona viagra generico vendita impotenza sessuale cialis vendita on line vendita cialis generico in italia levitra originale prezzo disfunzione erettile rimedi costo cialis 5 mg cialis italia vendita cialis senza ricetta vendita viagra senza ricetta levitra donna compro viagra generico pasticche cialis viagra senza prescrizione prezzo viagra in farmacia viagra generico prezzo cialis farmacia prezzo compra viagra originale viagra super acquisto viagra in farmacia differenze cialis viagra levitra costo cialis

Paperclip and MongoMapper

29 Aug 2009

I started a new project recently that deals with a lot of imported data, so it seemed like a good excuse to try out MongoDB and MongoMapper. The imported data also has a associated images, so I wanted to get the Paperclip plugin working with my Mongo-based models. Fortunately for me, it actually didn’t take too much work to pull out the ActiveRecord-specific bits. Here’s what I did…

The first hurdle was the has_attached_file method. This class method sets up some callbacks, defines a few instance methods, and sets up some validations. Since classes that include MongoMapper::Document don’t have the same validation code that classes descended from ActiveRecord::Base do, I had to tweak how the validations are set up.

The next problem was with one of the interpolations. I always like to use the id_partition interpolation, but the default Paperclip code assumes the id of the instance to which the file is attached is an integer. MongoDB uses alphanumeric strings as ids, though, so I had to check for that to determine which approach to take to create a partitioned path.

Here is the contents of a file that I put in config/initalizers/paperclip.rb to override the bits that needed to be changed:


write_inheritable_attribute(:attachment_definitions, {}) if attachment_definitions.nil?
attachment_definitions[name] = {:validations => []}.merge(options)

after_save :save_attached_files
before_destroy :destroy_attached_files

define_callbacks :before_post_process, :after_post_process
define_callbacks :"before_#{name}_post_process", :"after_#{name}_post_process"

define_method name do |*args|
a = attachment_for(name)
(args.length > 0) ? a.to_s(args.first) : a
end

define_method "#{name}=" do |file|
attachment_for(name).assign(file)
end

define_method "#{name}?" do
attachment_for(name).file?
end

validates_each name, :logic => lambda {
attachment = attachment_for(name)
attachment.send(:flush_errors) unless attachment.valid?
}
end
end

module Interpolations
# Handle string ids (mongo)
def id_partition attachment, style
if (id = attachment.instance.id).is_a?(Integer)
("%09d" % id).scan(/\d{3}/).join("/")
else
id.scan(/.{3}/).first(3).join("/")
end
end
end
end

The call to validates_each ought to be smarter about whether it’s dealing with AR’s validations or whether it’s dealing with John Nunemaker’s Validatable gem, but I’ll leave that for another day.

Finally, Paperclip depends on the instance having a logger method, as classes that inherit from ActiveRecord::Base have. To work around this, I just cheated and defined a logger method in my class that simply returned Rails.logger.

In the end, it didn’t take much work, so it should be fairly simple to get these changes back into Paperclip, should the interest be there. I’m also going to check out Carrierwave, which recently added MongoMapper support.


Actions

Informations

6 responses to “Paperclip and MongoMapper”

Tom (13:01:26) :

Hey Ben, I’m adding MongoDB to a production app this week for a particular feature implementation.

Have you looked into how the app works when a MongoDB server goes away?

Double Shot #529 « A Fresh Cup (03:03:48) :

[...] Paperclip and MongoMapper – Just in case you want to use Paperclip with one of those newfangled non-SQL databases. [...]

Ben (05:32:58) :

I haven’t gotten that far along, yet. I imagine it isn’t pretty. :)

Dan Croak (12:16:24) :

It’s about time for a storage adapter concept in Paperclip. file, s3, mongo, couch, etc.

Bring ideas to the mailing list and let’s get started on this!

Getting Paperclip to work with MongoMapper | Anlek's Blog (09:13:54) :

[...] GridFS, I wanted to use Paperclip with MongoMapper with the normal file system and I found this article from Ben Curtis, however with the latest version of Paperclip (version 2.3.1.1) and MongoMapper (version 0.7.6) I [...]

Mike (01:42:15) :

Thanks for this, it’s been really helpful. Just one thing (which I suspect has been caused by using newer versions) I also had to fix was paperclip seems to confuse itself areound different date and time classes and call to_f on a updated_at while it is saved as a Date which leads to errors. I’ve added a bit to this file which prevents the errors (although doesn’t fix the underlying confusion); gist linked

Leave a comment