module Netfira::WebConnect::Model::Record::Relations
These methods help relate and unrelate records
Public Instance Methods
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