Column
The column plugin provides interface for serializing and deserializing attachment data in format suitable for persisting in a database column (JSON by default).
plugin :columnSerializing
The Attacher#column_data method returns attached file data in serialized format, ready to be persisted into a database column.
attacher.attach(io) attacher.column_data #=> '{"id":"...","storage":"...","metadata":{...}}'If there is no attached file, nil is returned.
attacher.column_data #=> nilIf you want to retrieve this data as a Hash, use Attacher#data instead.
Deserializing
The Attacher.from_column method instantiates the attacher from serialized attached file data.
attacher = Shrine::Attacher.from_column('{"id":"...","storage":"...","metadata":{...}}') attacher.file #=> #<Shrine::UploadedFile>If nil is given, it means no attached file.
attacher = Shrine::Attacher.from_column(nil) attacher.file #=> nilAny additional options are forwarded to Attacher#initialize.
attacher = Shrine::Attacher.from_column('{...}', store: :other_store) attacher.store_key #=> :other_storeIf you want to load attachment data into an existing attacher, use Attacher#load_column.
attacher.file #=> nil attacher.load_column('{"id":"...","storage":"...","metadata":{...}}') attacher.file #=> #<Shrine::UploadedFile>If you want to load attachment from a Hash, use Attacher.from_data or Attacher#load_data instead.
Serializer
By default, the JSON standard library is used for serializing hash data. With the model and entity plugin, the data is serialized before writing to and deserialized after reading from the data attribute.
You can also use your own serializer via the :serializer option. The serializer object needs to implement #dump and #load methods:
class MyDataSerializer def self.dump(data) data #=> { "id" => "...", "storage" => "...", "metadata" => { ... } } JSON.generate(data) # serialize data, e.g. into JSON end def self.load(data) data #=> '{"id":"...", "storage":"...", "metadata": {...}}' JSON.parse(data) # deserialize data, e.g. from JSON end end plugin :column, serializer: MyDataSerializerSome serialization libraries such as Oj and MessagePack already implement this interface, which simplifies the configuration:
require "oj" # https://github.com/ohler55/oj plugin :column, serializer: OjIf you want to disable serialization and work with hashes directly, you can set :serializer to nil:
plugin :column, serializer: nil # disable serializationThe serializer can also be changed for a particular attacher instance:
Shrine::Attacher.new(column_serializer: Oj) # use custom serializer Shrine::Attacher.new(column_serializer: nil) # disable serialization