mongoid-versioning 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (195) hide show
  1. data/.gitignore +25 -0
  2. data/CHANGELOG.md +2 -0
  3. data/Gemfile +7 -0
  4. data/README.md +73 -0
  5. data/Rakefile +7 -0
  6. data/lib/mongoid/versioning.rb +217 -0
  7. data/lib/mongoid/versioning/version.rb +5 -0
  8. data/mongoid-versioning.gemspec +18 -0
  9. data/spec/app/models/account.rb +32 -0
  10. data/spec/app/models/acolyte.rb +16 -0
  11. data/spec/app/models/actor.rb +19 -0
  12. data/spec/app/models/actor_observer.rb +15 -0
  13. data/spec/app/models/actress.rb +2 -0
  14. data/spec/app/models/address.rb +72 -0
  15. data/spec/app/models/address_component.rb +5 -0
  16. data/spec/app/models/address_number.rb +6 -0
  17. data/spec/app/models/agency.rb +5 -0
  18. data/spec/app/models/agent.rb +12 -0
  19. data/spec/app/models/album.rb +14 -0
  20. data/spec/app/models/alert.rb +5 -0
  21. data/spec/app/models/animal.rb +25 -0
  22. data/spec/app/models/answer.rb +4 -0
  23. data/spec/app/models/appointment.rb +7 -0
  24. data/spec/app/models/article.rb +13 -0
  25. data/spec/app/models/artist.rb +66 -0
  26. data/spec/app/models/artwork.rb +4 -0
  27. data/spec/app/models/augmentation.rb +11 -0
  28. data/spec/app/models/author.rb +6 -0
  29. data/spec/app/models/band.rb +25 -0
  30. data/spec/app/models/bar.rb +9 -0
  31. data/spec/app/models/basic.rb +6 -0
  32. data/spec/app/models/bed.rb +1 -0
  33. data/spec/app/models/big_palette.rb +2 -0
  34. data/spec/app/models/birthday.rb +13 -0
  35. data/spec/app/models/book.rb +12 -0
  36. data/spec/app/models/breed.rb +4 -0
  37. data/spec/app/models/browser.rb +6 -0
  38. data/spec/app/models/building.rb +7 -0
  39. data/spec/app/models/building_address.rb +7 -0
  40. data/spec/app/models/bus.rb +7 -0
  41. data/spec/app/models/business.rb +5 -0
  42. data/spec/app/models/callback_recorder.rb +25 -0
  43. data/spec/app/models/callback_test.rb +9 -0
  44. data/spec/app/models/canvas.rb +25 -0
  45. data/spec/app/models/car.rb +1 -0
  46. data/spec/app/models/cat.rb +8 -0
  47. data/spec/app/models/category.rb +8 -0
  48. data/spec/app/models/child.rb +4 -0
  49. data/spec/app/models/child_doc.rb +22 -0
  50. data/spec/app/models/church.rb +4 -0
  51. data/spec/app/models/circle.rb +3 -0
  52. data/spec/app/models/circuit.rb +4 -0
  53. data/spec/app/models/circus.rb +7 -0
  54. data/spec/app/models/code.rb +5 -0
  55. data/spec/app/models/comment.rb +16 -0
  56. data/spec/app/models/contractor.rb +7 -0
  57. data/spec/app/models/cookie.rb +6 -0
  58. data/spec/app/models/country_code.rb +8 -0
  59. data/spec/app/models/definition.rb +7 -0
  60. data/spec/app/models/description.rb +11 -0
  61. data/spec/app/models/dictionary.rb +10 -0
  62. data/spec/app/models/division.rb +10 -0
  63. data/spec/app/models/doctor.rb +12 -0
  64. data/spec/app/models/dog.rb +6 -0
  65. data/spec/app/models/dokument.rb +5 -0
  66. data/spec/app/models/driver.rb +7 -0
  67. data/spec/app/models/drug.rb +8 -0
  68. data/spec/app/models/email.rb +6 -0
  69. data/spec/app/models/employer.rb +5 -0
  70. data/spec/app/models/entry.rb +6 -0
  71. data/spec/app/models/eraser.rb +1 -0
  72. data/spec/app/models/event.rb +22 -0
  73. data/spec/app/models/exhibition.rb +4 -0
  74. data/spec/app/models/exhibitor.rb +5 -0
  75. data/spec/app/models/eye.rb +9 -0
  76. data/spec/app/models/eye_bowl.rb +9 -0
  77. data/spec/app/models/face.rb +8 -0
  78. data/spec/app/models/favorite.rb +6 -0
  79. data/spec/app/models/filesystem.rb +4 -0
  80. data/spec/app/models/firefox.rb +4 -0
  81. data/spec/app/models/fish.rb +8 -0
  82. data/spec/app/models/folder.rb +7 -0
  83. data/spec/app/models/folder_item.rb +9 -0
  84. data/spec/app/models/fruits.rb +28 -0
  85. data/spec/app/models/game.rb +21 -0
  86. data/spec/app/models/ghost.rb +7 -0
  87. data/spec/app/models/home.rb +4 -0
  88. data/spec/app/models/house.rb +8 -0
  89. data/spec/app/models/html_writer.rb +3 -0
  90. data/spec/app/models/image.rb +22 -0
  91. data/spec/app/models/implant.rb +16 -0
  92. data/spec/app/models/item.rb +12 -0
  93. data/spec/app/models/jar.rb +7 -0
  94. data/spec/app/models/label.rb +40 -0
  95. data/spec/app/models/language.rb +5 -0
  96. data/spec/app/models/lat_lng.rb +15 -0
  97. data/spec/app/models/league.rb +11 -0
  98. data/spec/app/models/learner.rb +2 -0
  99. data/spec/app/models/line_item.rb +6 -0
  100. data/spec/app/models/location.rb +8 -0
  101. data/spec/app/models/login.rb +8 -0
  102. data/spec/app/models/manufacturer.rb +7 -0
  103. data/spec/app/models/meat.rb +4 -0
  104. data/spec/app/models/membership.rb +4 -0
  105. data/spec/app/models/mixed_drink.rb +4 -0
  106. data/spec/app/models/movie.rb +12 -0
  107. data/spec/app/models/my_hash.rb +2 -0
  108. data/spec/app/models/name.rb +23 -0
  109. data/spec/app/models/node.rb +5 -0
  110. data/spec/app/models/note.rb +12 -0
  111. data/spec/app/models/ordered_post.rb +6 -0
  112. data/spec/app/models/ordered_preference.rb +6 -0
  113. data/spec/app/models/oscar.rb +15 -0
  114. data/spec/app/models/override.rb +16 -0
  115. data/spec/app/models/ownable.rb +6 -0
  116. data/spec/app/models/owner.rb +6 -0
  117. data/spec/app/models/page.rb +5 -0
  118. data/spec/app/models/page_question.rb +4 -0
  119. data/spec/app/models/palette.rb +7 -0
  120. data/spec/app/models/paranoid_phone.rb +25 -0
  121. data/spec/app/models/paranoid_post.rb +36 -0
  122. data/spec/app/models/parent.rb +5 -0
  123. data/spec/app/models/parent_doc.rb +6 -0
  124. data/spec/app/models/passport.rb +5 -0
  125. data/spec/app/models/patient.rb +9 -0
  126. data/spec/app/models/pdf_writer.rb +3 -0
  127. data/spec/app/models/pencil.rb +1 -0
  128. data/spec/app/models/person.rb +200 -0
  129. data/spec/app/models/pet.rb +23 -0
  130. data/spec/app/models/pet_owner.rb +6 -0
  131. data/spec/app/models/phone.rb +11 -0
  132. data/spec/app/models/phone_observer.rb +6 -0
  133. data/spec/app/models/pizza.rb +7 -0
  134. data/spec/app/models/player.rb +35 -0
  135. data/spec/app/models/post.rb +42 -0
  136. data/spec/app/models/powerup.rb +11 -0
  137. data/spec/app/models/preference.rb +9 -0
  138. data/spec/app/models/princess.rb +8 -0
  139. data/spec/app/models/product.rb +15 -0
  140. data/spec/app/models/profile.rb +5 -0
  141. data/spec/app/models/pronunciation.rb +5 -0
  142. data/spec/app/models/purchase.rb +4 -0
  143. data/spec/app/models/question.rb +8 -0
  144. data/spec/app/models/quiz.rb +10 -0
  145. data/spec/app/models/rating.rb +8 -0
  146. data/spec/app/models/record.rb +46 -0
  147. data/spec/app/models/registry.rb +4 -0
  148. data/spec/app/models/role.rb +5 -0
  149. data/spec/app/models/root_category.rb +4 -0
  150. data/spec/app/models/sandwich.rb +4 -0
  151. data/spec/app/models/scheduler.rb +7 -0
  152. data/spec/app/models/seo.rb +7 -0
  153. data/spec/app/models/series.rb +4 -0
  154. data/spec/app/models/server.rb +13 -0
  155. data/spec/app/models/service.rb +22 -0
  156. data/spec/app/models/shape.rb +12 -0
  157. data/spec/app/models/shelf.rb +5 -0
  158. data/spec/app/models/shipping_container.rb +5 -0
  159. data/spec/app/models/shop.rb +6 -0
  160. data/spec/app/models/short_agent.rb +4 -0
  161. data/spec/app/models/short_quiz.rb +5 -0
  162. data/spec/app/models/slave.rb +6 -0
  163. data/spec/app/models/song.rb +8 -0
  164. data/spec/app/models/square.rb +4 -0
  165. data/spec/app/models/strategy.rb +3 -0
  166. data/spec/app/models/sub_item.rb +3 -0
  167. data/spec/app/models/survey.rb +5 -0
  168. data/spec/app/models/symptom.rb +6 -0
  169. data/spec/app/models/tag.rb +8 -0
  170. data/spec/app/models/target.rb +5 -0
  171. data/spec/app/models/template.rb +5 -0
  172. data/spec/app/models/thing.rb +9 -0
  173. data/spec/app/models/title.rb +4 -0
  174. data/spec/app/models/tool.rb +8 -0
  175. data/spec/app/models/topping.rb +5 -0
  176. data/spec/app/models/track.rb +38 -0
  177. data/spec/app/models/translation.rb +5 -0
  178. data/spec/app/models/tree.rb +9 -0
  179. data/spec/app/models/truck.rb +3 -0
  180. data/spec/app/models/user.rb +20 -0
  181. data/spec/app/models/user_account.rb +10 -0
  182. data/spec/app/models/validation_callback.rb +10 -0
  183. data/spec/app/models/vehicle.rb +11 -0
  184. data/spec/app/models/version.rb +5 -0
  185. data/spec/app/models/vet_visit.rb +5 -0
  186. data/spec/app/models/video.rb +17 -0
  187. data/spec/app/models/weapon.rb +11 -0
  188. data/spec/app/models/wiki_page.rb +17 -0
  189. data/spec/app/models/word.rb +12 -0
  190. data/spec/app/models/word_origin.rb +11 -0
  191. data/spec/app/models/writer.rb +11 -0
  192. data/spec/config/mongoid.yml +40 -0
  193. data/spec/mongoid/versioning_spec.rb +540 -0
  194. data/spec/spec_helper.rb +80 -0
  195. metadata +271 -0
@@ -0,0 +1,5 @@
1
+ class Parent
2
+ include Mongoid::Document
3
+ embeds_many :sub_items
4
+ embeds_one :first_child, class_name: "Child", as: :childable
5
+ end
@@ -0,0 +1,6 @@
1
+ class ParentDoc
2
+ include Mongoid::Document
3
+ field :statistic
4
+ field :children_order, type: Array, default: [] # hold all the children's id
5
+ embeds_many :child_docs
6
+ end
@@ -0,0 +1,5 @@
1
+ class Passport
2
+ include Mongoid::Document
3
+ field :number, type: String
4
+ embedded_in :person, autobuild: true
5
+ end
@@ -0,0 +1,9 @@
1
+ class Patient
2
+ include Mongoid::Document
3
+ field :title, type: String
4
+ store_in collection: "inpatient"
5
+ embeds_many :addresses, as: :addressable
6
+ embeds_one :email
7
+ embeds_one :name, as: :namable
8
+ validates_presence_of :title, on: :create
9
+ end
@@ -0,0 +1,3 @@
1
+ class PdfWriter < Writer
2
+ def write; end
3
+ end
@@ -0,0 +1 @@
1
+ class Pencil < Tool; end
@@ -0,0 +1,200 @@
1
+ class Person
2
+ include Mongoid::Document
3
+ attr_accessor :mode
4
+
5
+ class_attribute :somebody_elses_important_class_options
6
+ self.somebody_elses_important_class_options = { keep_me_around: true }
7
+
8
+ field :username, default: -> { "arthurnn#{rand(0..10)}" }
9
+ field :title
10
+ field :terms, type: Boolean
11
+ field :pets, type: Boolean, default: false
12
+ field :age, type: Integer, default: "100"
13
+ field :dob, type: Date
14
+ field :employer_id
15
+ field :lunch_time, type: Time
16
+ field :aliases, type: Array
17
+ field :map, type: Hash
18
+ field :map_with_default, type: Hash, default: {}
19
+ field :score, type: Integer
20
+ field :blood_alcohol_content, type: Float, default: ->{ 0.0 }
21
+ field :last_drink_taken_at, type: Date, default: ->{ 1.day.ago.in_time_zone("Alaska") }
22
+ field :ssn
23
+ field :owner_id, type: Integer
24
+ field :security_code
25
+ field :reading, type: Object
26
+ field :bson_id, type: Moped::BSON::ObjectId
27
+ field :pattern, type: Regexp
28
+ field :override_me, type: Integer
29
+ field :t, as: :test, type: String
30
+ field :i, as: :inte, type: Integer
31
+ field :a, as: :array, type: Array
32
+ field :desc, localize: true
33
+
34
+ index age: 1
35
+ index addresses: 1
36
+ index dob: 1
37
+ index name: 1
38
+ index title: 1
39
+
40
+ index({ ssn: 1 }, { unique: true })
41
+
42
+ attr_reader :rescored
43
+
44
+ attr_protected :security_code, :owner_id, :appointments
45
+
46
+ embeds_many :favorites, order: :title.desc, inverse_of: :perp, validate: false
47
+ embeds_many :videos, order: [[ :title, :asc ]], validate: false
48
+ embeds_many :phone_numbers, class_name: "Phone", validate: false
49
+ embeds_many :phones, store_as: :mobile_phones, validate: false
50
+ embeds_many :addresses, as: :addressable, validate: false do
51
+ def extension
52
+ "Testing"
53
+ end
54
+ def find_by_street(street)
55
+ where(street: street).first
56
+ end
57
+ end
58
+
59
+ embeds_many :address_components, validate: false
60
+ embeds_many :paranoid_phones, validate: false
61
+ embeds_many :services, cascade_callbacks: true, validate: false
62
+ embeds_many :symptoms, validate: false
63
+ embeds_many :appointments, validate: false
64
+
65
+ embeds_one :passport, autobuild: true, store_as: :pass, validate: false
66
+ embeds_one :pet, class_name: "Animal", validate: false
67
+ embeds_one :name, as: :namable, validate: false do
68
+ def extension
69
+ "Testing"
70
+ end
71
+ def dawkins?
72
+ first_name == "Richard" && last_name == "Dawkins"
73
+ end
74
+ end
75
+ embeds_one :quiz, validate: false
76
+
77
+ has_one :game, dependent: :destroy, validate: false do
78
+ def extension
79
+ "Testing"
80
+ end
81
+ end
82
+
83
+ has_many \
84
+ :posts,
85
+ dependent: :delete,
86
+ validate: false do
87
+ def extension
88
+ "Testing"
89
+ end
90
+ end
91
+ has_many :ordered_posts, order: :rating.desc, validate: false
92
+ has_many :paranoid_posts, validate: false
93
+ has_and_belongs_to_many \
94
+ :preferences,
95
+ index: true,
96
+ dependent: :nullify,
97
+ validate: false
98
+ has_and_belongs_to_many :user_accounts, validate: false
99
+ has_and_belongs_to_many :houses, validate: false
100
+ has_and_belongs_to_many :ordered_preferences, order: :value.desc, validate: false
101
+
102
+ has_many :drugs, validate: false
103
+ has_one :account, validate: false
104
+ has_one :cat, dependent: :nullify, validate: false, primary_key: :username
105
+ has_one :book, autobuild: true, validate: false
106
+ has_one :home, dependent: :delete, validate: false
107
+
108
+ has_and_belongs_to_many \
109
+ :administrated_events,
110
+ class_name: 'Event',
111
+ inverse_of: :administrators,
112
+ dependent: :nullify,
113
+ validate: false
114
+
115
+ accepts_nested_attributes_for :addresses
116
+ accepts_nested_attributes_for :paranoid_phones
117
+ accepts_nested_attributes_for :name, update_only: true
118
+ accepts_nested_attributes_for :pet, allow_destroy: true
119
+ accepts_nested_attributes_for :game, allow_destroy: true
120
+ accepts_nested_attributes_for :favorites, allow_destroy: true, limit: 5
121
+ accepts_nested_attributes_for :posts
122
+ accepts_nested_attributes_for :preferences
123
+ accepts_nested_attributes_for :quiz
124
+ accepts_nested_attributes_for :services, allow_destroy: true
125
+
126
+ scope :minor, where(:age.lt => 18)
127
+ scope :without_ssn, without(:ssn)
128
+ scope :search, ->(query){ any_of({ title: query }) }
129
+
130
+ def score_with_rescoring=(score)
131
+ @rescored = score.to_i + 20
132
+ self.score_without_rescoring = score
133
+ end
134
+
135
+ alias_method_chain :score=, :rescoring
136
+
137
+ def update_addresses
138
+ addresses.each do |address|
139
+ address.street = "Updated Address"
140
+ end
141
+ end
142
+
143
+ def employer=(emp)
144
+ self.employer_id = emp.id
145
+ end
146
+
147
+ def set_addresses=(addresses)
148
+ self.addresses = addresses
149
+ end
150
+
151
+ def override_me
152
+ read_attribute(:override_me).to_s
153
+ end
154
+
155
+ class << self
156
+ def accepted
157
+ scoped.where(terms: true)
158
+ end
159
+ def knight
160
+ scoped.where(title: "Sir")
161
+ end
162
+ def old
163
+ scoped.where(age: { "$gt" => 50 })
164
+ end
165
+ end
166
+
167
+ def reject_if_city_is_empty(attrs)
168
+ attrs[:city].blank?
169
+ end
170
+
171
+ def reject_if_name_is_blank(attrs)
172
+ attrs[:first_name].blank?
173
+ end
174
+
175
+ def foo
176
+ 'i_am_foo'
177
+ end
178
+
179
+ def preference_names=(names)
180
+ names.split(",").each do |name|
181
+ preference = Preference.where(name: name).first
182
+ if preference
183
+ self.preferences << preference
184
+ else
185
+ preferences.build(name: name)
186
+ end
187
+ end
188
+ end
189
+
190
+ def set_on_map_with_default=(value)
191
+ self.map_with_default["key"] = value
192
+ end
193
+
194
+ reset_callbacks(:validate)
195
+ reset_callbacks(:create)
196
+ reset_callbacks(:save)
197
+ reset_callbacks(:destroy)
198
+ end
199
+
200
+ require "app/models/doctor"
@@ -0,0 +1,23 @@
1
+ class Pet
2
+ include Mongoid::Document
3
+ field :name
4
+ field :weight, type: Float, default: 0.0
5
+ embeds_many :vet_visits
6
+ embedded_in :pet_owner
7
+
8
+ after_destroy :set_destroy_flag
9
+ attr_writer :destroy_flag
10
+
11
+ def set_destroy_flag
12
+ @destroy_flag = true
13
+ end
14
+
15
+ def destroy_flag
16
+ @destroy_flag ||= false
17
+ end
18
+
19
+ def visits_count=(count)
20
+ vet_visits.destroy_all
21
+ count.times { vet_visits.new }
22
+ end
23
+ end
@@ -0,0 +1,6 @@
1
+ class PetOwner
2
+ include Mongoid::Document
3
+ field :title
4
+ embeds_one :pet, cascade_callbacks: true
5
+ embeds_one :address, as: :addressable
6
+ end
@@ -0,0 +1,11 @@
1
+ class Phone
2
+ include Mongoid::Document
3
+
4
+ attr_accessor :number_in_observer
5
+
6
+ field :_id, type: String, default: ->{ number }
7
+
8
+ field :number
9
+ embeds_one :country_code
10
+ embedded_in :person
11
+ end
@@ -0,0 +1,6 @@
1
+ class PhoneObserver < Mongoid::Observer
2
+
3
+ def after_save(phone)
4
+ phone.number_in_observer = phone.number
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ class Pizza
2
+ include Mongoid::Document
3
+ field :name, type: String
4
+ has_one :topping, autosave: true
5
+ validates_presence_of :topping
6
+ accepts_nested_attributes_for :topping
7
+ end
@@ -0,0 +1,35 @@
1
+ class Player
2
+ include Mongoid::Document
3
+ field :active, type: Boolean
4
+ field :frags, type: Integer
5
+ field :deaths, type: Integer
6
+ field :impressions, type: Integer, default: 0
7
+ field :status
8
+
9
+ scope :active, where(active: true) do
10
+ def extension
11
+ "extension"
12
+ end
13
+ end
14
+
15
+ scope :inactive, where(active: false)
16
+ scope :frags_over, ->(count) { where(:frags.gt => count) }
17
+ scope :deaths_under, ->(count) { where(:deaths.lt => count) }
18
+ scope :deaths_over, ->(count) { where(:deaths.gt => count) }
19
+
20
+ has_many :weapons
21
+ has_one :powerup
22
+
23
+ embeds_many :implants
24
+ embeds_one :augmentation
25
+
26
+ after_find do |doc|
27
+ doc.impressions += 1
28
+ end
29
+
30
+ class << self
31
+ def alive
32
+ where(status: "Alive")
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,42 @@
1
+ class Post
2
+ include Mongoid::Document
3
+
4
+ field :title, type: String
5
+ field :content, type: String
6
+ field :rating, type: Integer
7
+ field :person_title, type: String, default: ->{ person.try(:title) }
8
+
9
+ attr_accessor :before_add_called, :after_add_called, :before_remove_called, :after_remove_called
10
+
11
+ belongs_to :person, counter_cache: true
12
+ belongs_to :author, foreign_key: :author_id, class_name: "User"
13
+ has_and_belongs_to_many :tags, before_add: :before_add_tag, after_add: :after_add_tag, before_remove: :before_remove_tag, after_remove: :after_remove_tag
14
+ has_many :videos, validate: false
15
+
16
+ scope :recent, where(created_at: { "$lt" => Time.now, "$gt" => 30.days.ago })
17
+ scope :posting, where(:content.in => [ "Posting" ])
18
+
19
+ validates_format_of :title, without: /\$\$\$/
20
+
21
+ def before_add_tag(tag)
22
+ @before_add_called = true
23
+ end
24
+
25
+ def after_add_tag(tag)
26
+ @after_add_called = true
27
+ end
28
+
29
+ def before_remove_tag(tag)
30
+ @before_remove_called = true
31
+ end
32
+
33
+ def after_remove_tag(tag)
34
+ @after_remove_called = true
35
+ end
36
+
37
+ class << self
38
+ def old
39
+ where(created_at: { "$lt" => 30.days.ago })
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,11 @@
1
+ class Powerup
2
+ include Mongoid::Document
3
+
4
+ field :name
5
+
6
+ belongs_to :player, inverse_of: :powerup
7
+
8
+ after_build do
9
+ self.name = "Quad Damage (#{player.frags})"
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ class Preference
2
+ include Mongoid::Document
3
+ field :name, type: String
4
+ field :value, type: String
5
+ field :ranking, type: Integer
6
+ has_and_belongs_to_many :people, validate: false
7
+ validates_length_of :name, minimum: 2, allow_nil: true
8
+ scope :posting, where(:value.in => [ "Posting" ])
9
+ end
@@ -0,0 +1,8 @@
1
+ class Princess
2
+ include Mongoid::Document
3
+ field :primary_color
4
+ def color
5
+ primary_color.to_s
6
+ end
7
+ validates_presence_of :color
8
+ end
@@ -0,0 +1,15 @@
1
+ class Product
2
+ include Mongoid::Document
3
+ field :description, localize: true
4
+ field :name, localize: true, default: "no translation"
5
+ field :price, type: Integer
6
+ field :brand_name
7
+ field :stores, type: Array
8
+ field :website, localize: true
9
+ alias_attribute :cost, :price
10
+
11
+ validates :name, presence: true
12
+ validates :website, format: { with: URI.regexp, allow_blank: true }
13
+
14
+ embeds_one :seo, as: :seo_tags, cascade_callbacks: true, autobuild: true
15
+ end
@@ -0,0 +1,5 @@
1
+ class Profile
2
+ include Mongoid::Document
3
+ field :name, type: String
4
+ shard_key :name
5
+ end
@@ -0,0 +1,5 @@
1
+ class Pronunciation
2
+ include Mongoid::Document
3
+ field :sound, type: String
4
+ embedded_in :word
5
+ end