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