mongoid_denormalize 0.2.0 → 0.2.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
@@ -34,11 +34,11 @@ In your model:
34
34
  Example
35
35
  -------
36
36
 
37
- def User
37
+ class User
38
38
  include Mongoid::Document
39
39
  include Mongoid::Denormalize
40
40
 
41
- references_many :comments
41
+ has_many :comments
42
42
 
43
43
  field :name
44
44
  field :email
@@ -46,11 +46,11 @@ Example
46
46
  denormalize :name, :email, :to => :comments
47
47
  end
48
48
 
49
- def Comment
49
+ class Comment
50
50
  include Mongoid::Document
51
51
  include Mongoid::Denormalize
52
52
 
53
- referenced_in :user
53
+ belongs_to :user
54
54
 
55
55
  field :body
56
56
 
@@ -87,6 +87,14 @@ the parent. When using the `:to` option, the parent will push the values to its
87
87
  # Multiple children. Will set the user_name attribute of "self.posts" and "self.comments" with "self.name".
88
88
  denormalize :name, :to => [:posts, :comments]
89
89
 
90
+ You must specify the type of all denormalizations when using the `:from` option, unless the denormalized type is `String`, the default.
91
+
92
+ # in User
93
+ field :location, :type => Array
94
+ denormalize :location, :to => :posts
95
+
96
+ # in Post
97
+ denormalize :location, :type => Array, :from => :user
90
98
 
91
99
  Rake tasks
92
100
  ----------
@@ -104,12 +112,20 @@ Known issues
104
112
 
105
113
  **Relational associations in combination with embedded records**
106
114
 
107
- If you are using denormalize with the `:to` option, to denormalize values on a relational association that is embedded in another collection,
108
- the denormalized fields will not be updated when the parent record is changed. This is due to a limitation in Mongoid that prevents querying
109
- embedded records through relational associations. One way to overcome this issue is to run `rake db:denormalize` in a cron job.
115
+ It is not recommended nor supported to use mongoid_denormalize to perform denormalization to embedded records through a relational association because
116
+ MongoDB/Mongoid do not support direct access to embedded fields via a relational association.
117
+
118
+ So, if User has_many :posts and User has_many :comments, but Comments are embedded_in :post, a user can't directly access a comment.
119
+
120
+
121
+ Contributors
122
+ -------
123
+ * hubsmoke (https://github.com/hubsmoke)
124
+ * Leo Lou (https://github.com/l4u)
125
+ * Austin Bales (https://github.com/arbales)
110
126
 
111
127
 
112
128
  Credits
113
129
  -------
114
130
 
115
- Copyright (c) 2010 Logan Raarup, released under the MIT license.
131
+ Copyright (c) 2010 Logan Raarup, released under the MIT license.
@@ -33,7 +33,7 @@ module Mongoid::Denormalize
33
33
 
34
34
  # Define schema
35
35
  unless options[:to]
36
- fields.each { |name| field "#{options[:from]}_#{name}", :type => options[:type] }
36
+ fields.each { |name| field "#{options[:from]}_#{name}", :type => options[:type] || String }
37
37
  end
38
38
  end
39
39
  end
@@ -59,14 +59,21 @@ module Mongoid::Denormalize
59
59
  def denormalize_to
60
60
  self.denormalize_definitions.each do |definition|
61
61
  next unless definition[:options][:to]
62
+ assigns = Hash[*definition[:fields].collect { |name| ["#{self.class.name.underscore}_#{name}", self.send(name)] }.flatten(1)]
62
63
 
63
- assigns = Hash[*definition[:fields].collect { |name| ["#{self.class.name.underscore}_#{name}", self.send(name)] }.flatten]
64
-
64
+
65
65
  [definition[:options][:to]].flatten.each do |association|
66
- if [:embedded_in, :embeds_one, :referenced_in, :references_one].include? self.class.reflect_on_association(association)
67
- self.send(association).update_attributes(assigns) unless self.send(association).blank?
66
+ relation = []
67
+ reflect = self.class.reflect_on_association(association)
68
+ relation = reflect.relation.macro unless reflect.nil? || reflect.relation.nil?
69
+
70
+ if [:embedded_in, :embeds_one, :referenced_in, :references_one, :has_one, :belongs_to].include? relation
71
+ c = self.send(association)
72
+
73
+ c.update_attributes(assigns) unless c.blank?
68
74
  else
69
- self.send(association).to_a.each { |a| a.update_attributes(assigns) }
75
+ c = self.send(association)
76
+ c.to_a.each { |a| a.update_attributes(assigns) }
70
77
  end
71
78
  end
72
79
  end
@@ -4,11 +4,11 @@ namespace :db do
4
4
  get_denormalizable_models.each do |klass|
5
5
  if klass.embedded?
6
6
  reflection = klass.reflect_on_all_associations(:embedded_in).first
7
- parent = reflection.options[:name].to_s.classify.constantize
7
+ parent = reflection.class_name.to_s.classify.constantize
8
8
 
9
9
  unless parent.embedded?
10
10
  parent.all.each do |parent_instance|
11
- parent_instance.send(reflection.options[:inverse_of]).each(&:repair_denormalized!)
11
+ parent_instance.send(reflection.inverse).each(&:repair_denormalized!)
12
12
  end
13
13
  end
14
14
  else
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
- - 0
9
- version: 0.2.0
8
+ - 2
9
+ version: 0.2.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - Logan Raarup
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-09-07 00:00:00 +02:00
17
+ date: 2011-08-04 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -22,14 +22,13 @@ dependencies:
22
22
  prerelease: false
23
23
  requirement: &id001 !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - ~>
25
+ - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  segments:
28
28
  - 2
29
- - 0
30
- - 0
31
- - beta9
32
- version: 2.0.0.beta9
29
+ - 1
30
+ - 9
31
+ version: 2.1.9
33
32
  type: :runtime
34
33
  version_requirements: *id001
35
34
  description: Helper module for denormalizing association attributes in Mongoid models.
@@ -52,8 +51,8 @@ homepage: http://github.com/logandk/mongoid_denormalize
52
51
  licenses: []
53
52
 
54
53
  post_install_message:
55
- rdoc_options:
56
- - --charset=UTF-8
54
+ rdoc_options: []
55
+
57
56
  require_paths:
58
57
  - lib
59
58
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -77,9 +76,5 @@ rubygems_version: 1.3.6
77
76
  signing_key:
78
77
  specification_version: 3
79
78
  summary: Mongoid denormalization helper.
80
- test_files:
81
- - spec/app/models/comment.rb
82
- - spec/app/models/post.rb
83
- - spec/app/models/user.rb
84
- - spec/mongoid_denormalize_spec.rb
85
- - spec/spec_helper.rb
79
+ test_files: []
80
+
@@ -1,13 +0,0 @@
1
- class Comment
2
- include Mongoid::Document
3
- include Mongoid::Denormalize
4
-
5
- field :body
6
-
7
- embedded_in :post, :inverse_of => :comments
8
- referenced_in :user
9
-
10
- denormalize :name, :from => :user
11
- denormalize :email, :from => :user
12
- denormalize :created_at, :type => Time, :from => :post
13
- end
@@ -1,14 +0,0 @@
1
- class Post
2
- include Mongoid::Document
3
- include Mongoid::Denormalize
4
-
5
- field :title
6
- field :body
7
- field :created_at, :type => Time
8
-
9
- referenced_in :user
10
- embeds_many :comments
11
-
12
- denormalize :name, :email, :from => :user
13
- denormalize :created_at, :to => :comments
14
- end
@@ -1,12 +0,0 @@
1
- class User
2
- include Mongoid::Document
3
- include Mongoid::Denormalize
4
-
5
- field :name
6
- field :email
7
-
8
- references_one :post
9
- references_many :comments
10
-
11
- denormalize :name, :email, :to => [:post, :comments]
12
- end
@@ -1,103 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Mongoid::Denormalize do
4
- before(:all) do
5
- Mongoid.master.collections.select {|c| c.name !~ /system/ }.each(&:drop)
6
-
7
- @post = Post.create!(:title => "Blog post", :body => "Lorem ipsum...", :created_at => Time.parse("Jan 1 2010 12:00"))
8
- @user = User.create!(:name => "John Doe", :email => "john@doe.com", :post => @post)
9
- @comment = @post.comments.create(:body => "This is the comment", :user => @user)
10
-
11
- @user.comments << @comment
12
-
13
- @other_user = User.create!(:name => "Bill")
14
- end
15
-
16
- context "denormalize from" do
17
- it "should define multiple fields for association" do
18
- @post.fields.should have_key "user_name"
19
- @post.fields.should have_key "user_email"
20
- end
21
-
22
- it "should default to string field type for associated fields" do
23
- @post.fields["user_name"].type.should eql String
24
- end
25
-
26
- it "should allow setting the field type for associated fields" do
27
- @comment.fields["post_created_at"].type.should eql Time
28
- end
29
-
30
- it "should allow multiple declarations for the same association" do
31
- @comment.fields.should have_key "user_name"
32
- @comment.fields.should have_key "user_email"
33
- end
34
-
35
- it "should denormalize fields without specified type" do
36
- @comment.user_name.should eql @user.name
37
- @comment.user_email.should eql @user.email
38
- @post.user_name.should eql @user.name
39
- @post.user_email.should eql @user.email
40
- end
41
-
42
- it "should denormalize fields with specified type" do
43
- @comment.post_created_at.should eql @post.created_at
44
- end
45
-
46
- it "should update denormalized values if attribute is changed" do
47
- @user.update_attributes(:name => "Bob Doe")
48
-
49
- @comment.user_name.should eql @user.name
50
- end
51
-
52
- it "should update denormalized values if object is changed" do
53
- @other_user = User.create!(:name => "Bill", :email => "bill@doe.com")
54
-
55
- @comment.user = @other_user
56
- @comment.save!
57
-
58
- @comment.user_name.should eql @other_user.name
59
- @comment.user_email.should eql @other_user.email
60
- end
61
- end
62
-
63
- context "denormalize to" do
64
- it "should push denormalized fields to one-to-one association" do
65
- @user.name = "Elvis"
66
- @user.save!
67
-
68
- @post.user_name.should eql "Elvis"
69
- end
70
-
71
- it "should push denormalized fields to one-to-many association" do
72
- @post.created_at = Time.parse("Jan 1 2011 12:00")
73
- @post.save!
74
-
75
- @comment.post_created_at.should eql Time.parse("Jan 1 2011 12:00")
76
- end
77
- end
78
-
79
- context "rake task" do
80
- it "should correct inconsistent denormalizations on regular documents" do
81
- Post.collection.update({ '_id' => @post.id }, { '$set' => { 'user_name' => 'Clint Eastwood' } })
82
-
83
- Rake::Task["db:denormalize"].invoke
84
- Rake::Task["db:denormalize"].reenable
85
-
86
- @post.reload
87
- @post.user_name.should eql @user.name
88
- end
89
-
90
- it "should correct inconsistent denormalizations on referenced embedded documents" do
91
- @rake_user = User.create!(:name => "Johnny Depp", :email => "johnny@depp.com")
92
- @rake_comment = @post.comments.create!(:body => "Depp's comment", :user => @rake_user)
93
-
94
- @rake_user.update_attributes!(:name => "J. Depp")
95
-
96
- Rake::Task["db:denormalize"].invoke
97
- Rake::Task["db:denormalize"].reenable
98
-
99
- @post.reload
100
- @post.comments.last.user_name.should eql @rake_user.name
101
- end
102
- end
103
- end
data/spec/spec_helper.rb DELETED
@@ -1,18 +0,0 @@
1
- require 'rubygems'
2
- require 'spec'
3
- require 'mongoid'
4
- require 'yaml'
5
- require 'rake'
6
-
7
- # Load rake tasks
8
- load File.expand_path("../../lib/railties/denormalize.rake", __FILE__)
9
- task :environment do
10
- Dir.chdir(File.dirname(__FILE__))
11
- end
12
-
13
- Mongoid.configure do |config|
14
- config.master = Mongo::Connection.new.db("mongoid_denormalize_development")
15
- end
16
-
17
- require File.expand_path("../../lib/mongoid_denormalize", __FILE__)
18
- Dir["#{File.dirname(__FILE__)}/app/models/*.rb"].each { |f| require f }