module Netfira::WebConnect::Model::Record::Relations

These methods help relate and unrelate records

Public Instance Methods

<<(record)
Alias for: relate
relate(record) click to toggle source
# File lib/netfira/web_connect/model/record/relations.rb, line 7
def relate(record)
  error_messages = {
      no_relation: 'You cannot add a %s to a %s',
      wrong_shop: 'Tried to add a record from shop %s to shop %s'
  }
  prepare_relation(record, error_messages) do |relation_class, attrs|
    relation_class.with_deleted.find_or_create_by(attrs).tap { |x| x.restore! if x.destroyed? }
  end
end
Also aliased as: <<
unrelate(record) click to toggle source
# File lib/netfira/web_connect/model/record/relations.rb, line 19
def unrelate(record)
  error_messages = {
      no_relation: 'You cannot remove a %s from a %s',
      wrong_shop: 'Tried to remove a record of shop %s from shop %s'
  }
  prepare_relation(record, error_messages) do |relation_class, attrs|
    relation_class.with_deleted.find_by(attrs).tap { |x| x.destroy! if x }
  end
end

Private Instance Methods

prepare_relation(record, error_messages) { |relation_class, attrs| ... } click to toggle source

This method assists relate and unrelate

# File lib/netfira/web_connect/model/record/relations.rb, line 32
def prepare_relation(record, error_messages)

  # The class of the relation between self and record
  relation_class = Model::Record::Relation.for(self, record)

  # Error for unrelatable classes
  raise error_messages[:no_relation] % [record.class.name.demodulize, self.class.name.demodulize] unless relation_class

  # Error for shop mismatches
  raise error_messages[:wrong_shop] % [record.shop_id, shop_id] unless shop_id == record.shop_id

  # The attributes to use for create or delete, e.g. {product_id: 1, category_id: 2}
  attrs = [self, record].map{ |r| ["#{r.class.name.demodulize.underscore}_id", r.id]}.to_h

  yield relation_class, attrs
end