Method: Spree::Product#duplicate

Defined in:
app/models/spree/product.rb

#duplicateObject

for adding products which are closely related to existing ones define “duplicate_extra” for site-specific actions, eg for additional fields



149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'app/models/spree/product.rb', line 149

def duplicate
  p = self.dup
  p.name = 'COPY OF ' + name
  p.deleted_at = nil
  p.created_at = p.updated_at = nil
  p.taxons = taxons

  p.product_properties = product_properties.map { |q| r = q.dup; r.created_at = r.updated_at = nil; r }

  image_dup = lambda { |i| j = i.dup; j.attachment = i.attachment.clone; j }

  variant = master.dup
  variant.sku = 'COPY OF ' + master.sku
  variant.deleted_at = nil
  variant.images = master.images.map { |i| image_dup.call i }
  p.master = variant

  # don't dup the actual variants, just the characterising types
  p.option_types = option_types if has_variants?

  # allow site to do some customization
  p.send(:duplicate_extra, self) if p.respond_to?(:duplicate_extra)
  p.save!
  p
end