mm-nested-attrs 0.0.1

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.
Files changed (3) hide show
  1. data/README.txt +0 -0
  2. data/lib/mm-nested-attrs.rb +60 -0
  3. metadata +48 -0
File without changes
@@ -0,0 +1,60 @@
1
+ module MongoMapper
2
+ module Plugins
3
+ module Associations
4
+ module NestedAttributes
5
+ extend ActiveSupport::Concern
6
+
7
+ module ClassMethods
8
+ def accepts_nested_attributes_for(*attr_names)
9
+ options = { :allow_destroy => false }
10
+ options.update(attr_names.extract_options!)
11
+ options.assert_valid_keys(:allow_destroy, :reject_if)
12
+
13
+ for association_name in attr_names
14
+ module_eval %{
15
+ def #{association_name}_attributes=(attributes)
16
+ assign_nested_attributes_for_association(:#{association_name}, attributes, #{options[:allow_destroy]})
17
+ end
18
+ }, __FILE__, __LINE__
19
+ end
20
+ end
21
+ end
22
+
23
+ module InstanceMethods
24
+ UNASSIGNABLE_KEYS = %w{ id _id _destroy }
25
+
26
+ def assign_nested_attributes_for_association(association_name, attributes_collection, allow_destroy)
27
+ class_name = self.associations[association_name].options[:class_name] || class_name
28
+
29
+ unless attributes_collection.is_a?(Hash) || attributes_collection.is_a?(Array)
30
+ raise ArgumentError, "Hash or Array expected, got #{attributes_collection.class.name} (#{attributes_collection.inspect})"
31
+ end
32
+
33
+ if attributes_collection.is_a? Hash
34
+ attributes_collection = attributes_collection.sort_by { |index, _| index.to_i }.map { |_, attributes| attributes }
35
+ end
36
+
37
+ attributes_collection.each do |attributes|
38
+ attributes.stringify_keys!
39
+
40
+ if attributes['_id'].blank?
41
+ send(association_name) << class_name.constantize.new(attributes)
42
+ elsif existing_record = send(association_name).detect { |record| record.id.to_s == attributes['_id'].to_s }
43
+ if existing_record.has_destroy_flag?(attributes) && allow_destroy
44
+ send(association_name).delete(existing_record)
45
+ existing_record.destroy unless class_name.constantize.embeddable?
46
+ else
47
+ existing_record.attributes = attributes.except(*UNASSIGNABLE_KEYS)
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ def has_destroy_flag?(hash)
54
+ Boolean.to_mongo(hash['_destroy'])
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mm-nested-attrs
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Sergiy Shevchik
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-08 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: allows accepts_nested_attributes_for in models
15
+ email: berrouz@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files:
19
+ - README.txt
20
+ files:
21
+ - lib/mm-nested-attrs.rb
22
+ - README.txt
23
+ homepage: https://github.com/berrouz/mm-nested-attrs
24
+ licenses: []
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: 1.9.3
35
+ required_rubygems_version: !ruby/object:Gem::Requirement
36
+ none: false
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ requirements: []
42
+ rubyforge_project:
43
+ rubygems_version: 1.8.11
44
+ signing_key:
45
+ specification_version: 3
46
+ summary: MongoMapper plugin for nested attributes
47
+ test_files: []
48
+ has_rdoc: