mongoid_listable 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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: