mongoid-versioning 0.1.0

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 (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