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