lib/mongoid/orderable.rb in mongoid_orderable-0.9.0 vs lib/mongoid/orderable.rb in mongoid_orderable-0.9.1
- old
+ new
@@ -11,11 +11,11 @@
:column => :position,
:scope => nil
}
configuration.update options if options.is_a?(Hash)
- field configuration[:column], type: Integer
+ field configuration[:column], :type => Integer
index configuration[:column]
configuration[:scope] = "#{configuration[:scope]}_id".to_sym if configuration[:scope].is_a?(Symbol) && configuration[:scope].to_s !~ /_id$/
case configuration[:scope]
@@ -34,130 +34,126 @@
before_save :add_to_list
after_destroy :remove_from_list
end
end
- module InstanceMethods
+ def move_to! target_position
+ @move_to = target_position
+ save
+ end
+ alias_method :insert_at!, :move_to!
- def move_to! target_position
- @move_to = target_position
- save
- end
- alias_method :insert_at!, :move_to!
+ def move_to target_position
+ @move_to = target_position
+ end
+ alias_method :insert_at, :move_to
- def move_to target_position
- @move_to = target_position
- end
- alias_method :insert_at, :move_to
+ def move_to= target_position
+ @move_to = target_position
+ end
+ alias_method :insert_at=, :move_to=
- def move_to= target_position
- @move_to = target_position
+ [:top, :bottom].each do |symbol|
+ define_method "move_to_#{symbol}" do
+ move_to symbol
end
- alias_method :insert_at=, :move_to=
- [:top, :bottom].each do |symbol|
- define_method "move_to_#{symbol}" do
- move_to symbol
- end
-
- define_method "move_to_#{symbol}!" do
- move_to! symbol
- end
+ define_method "move_to_#{symbol}!" do
+ move_to! symbol
end
+ end
- [:higher, :lower].each do |symbol|
- define_method "move_#{symbol}" do
- move_to symbol
- end
-
- define_method "move_#{symbol}!" do
- move_to! symbol
- end
+ [:higher, :lower].each do |symbol|
+ define_method "move_#{symbol}" do
+ move_to symbol
end
- def first?
- in_list? && orderable_position == 1
+ define_method "move_#{symbol}!" do
+ move_to! symbol
end
+ end
- def last?
- in_list? && orderable_position == bottom_orderable_position
- end
+ def first?
+ in_list? && orderable_position == 1
+ end
- def in_list?
- !orderable_position.nil?
- end
+ def last?
+ in_list? && orderable_position == bottom_orderable_position
+ end
- def add_to_list
- apply_position @move_to
- end
+ def in_list?
+ !orderable_position.nil?
+ end
- def remove_from_list
- orderable_scoped.where(orderable_column.gt => orderable_position).inc(orderable_column => -1)
- end
+ def add_to_list
+ apply_position @move_to
+ end
- private
+ def remove_from_list
+ orderable_scoped.where(orderable_column.gt => orderable_position).inc(orderable_column => -1)
+ end
- def orderable_position
- send orderable_column
- end
+private
- def orderable_position= value
- send "#{orderable_column}=", value
- end
+ def orderable_position
+ send orderable_column
+ end
- def orderable_scoped
- if embedded?
- send(metadata.inverse).send(metadata.name).orderable_scope(self)
- else
- self.class.orderable_scope(self)
- end
- end
+ def orderable_position= value
+ send "#{orderable_column}=", value
+ end
- def orderable_scope_changed?
- !orderable_scoped.where(:_id => _id).exists?
+ def orderable_scoped
+ if embedded?
+ send(metadata.inverse).send(metadata.name).orderable_scope(self)
+ else
+ self.class.orderable_scope(self)
end
+ end
- def apply_position target_position
- if persisted? && !embedded? && orderable_scope_changed?
- self.class.find(_id).remove_from_list
- self.orderable_position = nil
- end
-
- return if !target_position && in_list?
+ def orderable_scope_changed?
+ !orderable_scoped.where(:_id => _id).exists?
+ end
- target_position = target_position_to_position target_position
+ def apply_position target_position
+ if persisted? && !embedded? && orderable_scope_changed?
+ self.class.find(_id).remove_from_list
+ self.orderable_position = nil
+ end
- unless in_list?
- orderable_scoped.where(orderable_column.gte => target_position).inc(orderable_column => 1)
- else
- orderable_scoped.where(orderable_column.gte => target_position, orderable_column.lt => orderable_position).inc(orderable_column => 1) if target_position < orderable_position
- orderable_scoped.where(orderable_column.gt => orderable_position, orderable_column.lte => target_position).inc(orderable_column => -1) if target_position > orderable_position
- end
+ return if !target_position && in_list?
- self.orderable_position = target_position
+ target_position = target_position_to_position target_position
+
+ unless in_list?
+ orderable_scoped.where(orderable_column.gte => target_position).inc(orderable_column => 1)
+ else
+ orderable_scoped.where(orderable_column.gte => target_position, orderable_column.lt => orderable_position).inc(orderable_column => 1) if target_position < orderable_position
+ orderable_scoped.where(orderable_column.gt => orderable_position, orderable_column.lte => target_position).inc(orderable_column => -1) if target_position > orderable_position
end
- def target_position_to_position target_position
- target_position = :bottom unless target_position
+ self.orderable_position = target_position
+ end
- target_position = case target_position.to_sym
- when :top then 1
- when :bottom then bottom_orderable_position
- when :higher then orderable_position.pred
- when :lower then orderable_position.next
- end unless target_position.is_a? Numeric
+ def target_position_to_position target_position
+ target_position = :bottom unless target_position
- target_position = 1 if target_position < 1
- target_position = bottom_orderable_position if target_position > bottom_orderable_position
- target_position
- end
+ target_position = case target_position.to_sym
+ when :top then 1
+ when :bottom then bottom_orderable_position
+ when :higher then orderable_position.pred
+ when :lower then orderable_position.next
+ end unless target_position.is_a? Numeric
- def bottom_orderable_position
- @bottom_orderable_position = begin
- max = orderable_scoped.max(orderable_column).to_i
- in_list? ? max : max.next
- end
- end
+ target_position = 1 if target_position < 1
+ target_position = bottom_orderable_position if target_position > bottom_orderable_position
+ target_position
+ end
+ def bottom_orderable_position
+ @bottom_orderable_position = begin
+ max = orderable_scoped.max(orderable_column).to_i
+ in_list? ? max : max.next
+ end
end
end