lib/resonance.rb in resonance-0.3.3 vs lib/resonance.rb in resonance-0.4.0

- old
+ new

@@ -9,16 +9,24 @@ end module ClassMethods include Resonance::Supports::Converter - def resonate(subject, with: nil, by: nil, **options) - @roles = { source: subject, target: with, action: by } - @options = options + def resonate(source, target: nil, action: nil, foreign_key: {}) + [source, target, action].each do |role| + if role.nil? + raise Resonance::Errors::ArgumentError, 'Passed argument is not a valid' + end + end - if @roles.values.any?(&:nil?) - raise Resonance::Errors::ArgumentError, 'Passed argument is not a valid' + source = source.to_s + target = target.to_s + action = action.to_s + + foreign_key.tap do |key| + key[:source] = :"#{source}_id" if key[:source].nil? + key[:target] = :"target_#{target}_id" if key[:target].nil? end classify(source).class_eval <<-EOS has_many :#{pluralize(action)}, foreign_key: :#{source}_id, @@ -31,64 +39,46 @@ def #{action}(target) if #{progressize(action)}?(target) || (self == target) return end - #{pluralize(action)}.create(#{foreign_key}: target.id) + #{pluralize(action)}.create(#{foreign_key[:target]}: target.id) end def un#{action}(target) unless #{progressize(action)}?(target) return end - #{pluralize(action)}.find_by(#{foreign_key}: target.id).destroy + #{pluralize(action)}.find_by(#{foreign_key[:target]}: target.id).destroy end def #{progressize(action)}?(target) - #{pluralize(action)}.exists?(#{foreign_key}: target.id) + #{pluralize(action)}.exists?(#{foreign_key[:target]}: target.id) end EOS classify(target).class_eval <<-EOS has_many :#{pluralize(action)}_as_target, - foreign_key: :#{foreign_key}, + foreign_key: :#{foreign_key[:target]}, class_name: '#{classify(action)}', dependent: :destroy has_many :#{peoplize(action)}, through: :#{pluralize(action)}_as_target, source: :#{source} def #{pastize(action)}_by?(source) - source.#{pluralize(action)}.exists?(#{foreign_key}: id) + source.#{pluralize(action)}.exists?(#{foreign_key[:target]}: id) end EOS classify(action).class_eval <<-EOS belongs_to :#{source} belongs_to :target_#{target}, class_name: '#{classify(target)}', - foreign_key: :#{foreign_key} + foreign_key: :#{foreign_key[:target]} EOS - end - - private - - def source - @roles[:source].to_s - end - - def target - @roles[:target].to_s - end - - def action - @roles[:action].to_s - end - - def foreign_key - @options[:foreign_key] || "target_#{target}_id" end end end