mongoid_listable 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -1,6 +1,39 @@
1
- # MongoidListable
1
+ # Mongoid Listable
2
2
 
3
- TODO: Write a gem description
3
+ Mongoid Listable will eventually be a full replacement library for Mongoid List or Mongoid Orderable. Both
4
+ libraries fail to accomplish the simple task this library handles: lists that need to be specific for a given `has_many`
5
+ relation.
6
+
7
+ ## Usage
8
+
9
+ class User
10
+ include Mongoid::Document
11
+ include Mongoid:Listable
12
+
13
+ has_many :photos
14
+
15
+ lists :photos
16
+
17
+ end
18
+
19
+ class Photo
20
+ include Mongoid::Document
21
+
22
+ belongs_to :user
23
+
24
+ end
25
+
26
+ Now, photos that are assigned to a user via by the method `user.photo_ids=[ids]` will maintain position based on the index
27
+ of the id in the array argument.
28
+
29
+ In this example, each photo object that belongs to the user will obtain a field called `user_position`. The 1-n relation of
30
+ a user to their photos will automatically be ordered by `user_position` unless otherwise specified.
31
+
32
+ You can also override the name of the position column:
33
+
34
+ lists :photos, column: :users_photos_order
35
+
36
+ There's a lot more to add to the library. At this point, it will conveniently handle rails based multiselect form fields.
4
37
 
5
38
  ## Installation
6
39
 
@@ -16,10 +49,6 @@ Or install it yourself as:
16
49
 
17
50
  $ gem install mongoid_listable
18
51
 
19
- ## Usage
20
-
21
- TODO: Write usage instructions here
22
-
23
52
  ## Contributing
24
53
 
25
54
  1. Fork it
data/lib/mongoid/lists.rb CHANGED
@@ -6,7 +6,11 @@ module Mongoid
6
6
 
7
7
  extend ActiveSupport::Concern
8
8
 
9
- FIELD_SUFFIX = '_position'
9
+ FIELD_SUFFIX = '_position'
10
+
11
+ include do
12
+ after_add
13
+ end
10
14
 
11
15
  module ClassMethods
12
16
 
@@ -20,15 +24,24 @@ module Mongoid
20
24
  # @since 0.0.1
21
25
  def lists relation, options={}
22
26
  meta = reflect_on_association relation
23
- field_name = options[:column] || (meta[:name].to_s + FIELD_SUFFIX).to_sym
24
- klass = meta.klass
27
+ field_name = options[:column] || (meta.foreign_key.to_s.gsub(/_?id$/, FIELD_SUFFIX)).to_sym
28
+ klass = meta.klass
25
29
 
26
- re_define_method "#{relation.to_s.singularize}_ids=" do |ids|
30
+ ids_setter_name = "#{relation.to_s.singularize}_ids="
31
+ ids_setter = instance_method ids_setter_name
32
+ re_define_method ids_setter_name do |ids|
33
+ # assign new position int
27
34
  ids.each_with_index do |id, index|
28
35
  klass.find(id).update_attribute field_name, index + 1
29
36
  end
30
37
 
31
- send(meta.setter, klass.find(ids.reject(&:blank?)))
38
+ # unassign old position ints
39
+ klass.where(meta.foreign_key => id).not_in(id: ids).each do |obj|
40
+ obj.update_attribute field_name, nil
41
+ end
42
+
43
+ # invoke original method
44
+ ids_setter.bind(self).call(ids)
32
45
  end
33
46
 
34
47
  meta[:order] = "#{field_name} asc"
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = 'mongoid_listable'
7
- spec.version = '0.0.1'
7
+ spec.version = '0.0.2'
8
8
  spec.authors = [ 'richardcalahan' ]
9
9
  spec.email = [ 'richard@calahan.me' ]
10
10
  spec.description = ''
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid_listable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: