lib/joint.rb in joint-0.2 vs lib/joint.rb in joint-0.3
- old
+ new
@@ -6,11 +6,11 @@
autoload :Version, 'joint/version'
module ClassMethods
def attachment(name)
self.class.class_inheritable_accessor :attachment_names unless self.class.respond_to?(:attachment_names)
- self.class.attachment_names ||= []
+ self.class.attachment_names ||= Set.new
self.class.attachment_names << name
after_save :save_attachments
after_save :destroy_nil_attachments
before_destroy :destroy_all_attachments
@@ -31,14 +31,14 @@
def #{name}=(file)
if file.nil?
nil_attachments << :#{name}
else
- self["#{name}_id"] = Mongo::ObjectID.new
- self["#{name}_size"] = File.size(file)
- self["#{name}_type"] = Wand.wave(file.path)
- self["#{name}_name"] = Joint.file_name(file)
+ self["#{name}_id"] = Mongo::ObjectID.new if self["#{name}_id"].nil?
+ self["#{name}_size"] = File.size(file)
+ self["#{name}_type"] = Wand.wave(file.path)
+ self["#{name}_name"] = Joint.file_name(file)
assigned_attachments[:#{name}] = file
end
end
EOC
end
@@ -56,28 +56,30 @@
def nil_attachments
@nil_attachments ||= Set.new
end
+ # IO must respond to read and rewind
def save_attachments
- assigned_attachments.each do |attachment|
- name, file = attachment
- if file.respond_to?(:read)
- file.rewind if file.respond_to?(:rewind)
- grid.put(file.read, self["#{name}_name"], {
- :_id => self["#{name}_id"],
- :content_type => self["#{name}_type"],
- })
- end
- end.tap(&:clear)
+ assigned_attachments.each_pair do |name, io|
+ next unless io.respond_to?(:read)
+ io.rewind if io.respond_to?(:rewind)
+ grid.delete(send(name).id)
+ grid.put(io.read, send(name).name, {
+ :_id => send(name).id,
+ :content_type => send(name).type,
+ })
+ end
+ assigned_attachments.clear
end
def destroy_nil_attachments
- nil_attachments.each { |name| grid.delete(self["#{name}_id"]) }.tap(&:clear)
+ nil_attachments.each { |name| grid.delete(send(name).id) }
+ nil_attachments.clear
end
def destroy_all_attachments
- self.class.attachment_names.each { |name| grid.delete(self["#{name}_id"]) }
+ self.class.attachment_names.map { |name| grid.delete(send(name).id) }
end
end
class AttachmentProxy
def initialize(instance, name)