mongoid_geospatial 1.0.0rc0

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 (109) hide show
  1. data/.document +5 -0
  2. data/.gitignore +49 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +11 -0
  5. data/README.md +330 -0
  6. data/Rakefile +18 -0
  7. data/lib/mongoid_geospatial/contexts/mongo.rb +115 -0
  8. data/lib/mongoid_geospatial/criteria.rb +5 -0
  9. data/lib/mongoid_geospatial/criterion/complex.rb +19 -0
  10. data/lib/mongoid_geospatial/criterion/inclusion.rb +14 -0
  11. data/lib/mongoid_geospatial/criterion/near_spatial.rb +50 -0
  12. data/lib/mongoid_geospatial/criterion/within_spatial.rb +60 -0
  13. data/lib/mongoid_geospatial/criterion.rb +3 -0
  14. data/lib/mongoid_geospatial/extensions/hash.rb +22 -0
  15. data/lib/mongoid_geospatial/extensions/symbol.rb +46 -0
  16. data/lib/mongoid_geospatial/field_option.rb +16 -0
  17. data/lib/mongoid_geospatial/fields/line_string.rb +18 -0
  18. data/lib/mongoid_geospatial/fields/point.rb +51 -0
  19. data/lib/mongoid_geospatial/fields/polygon.rb +22 -0
  20. data/lib/mongoid_geospatial/finders.rb +5 -0
  21. data/lib/mongoid_geospatial/geospatial/core_ext.rb +27 -0
  22. data/lib/mongoid_geospatial/geospatial/geo_near_results.rb +140 -0
  23. data/lib/mongoid_geospatial/geospatial.rb +86 -0
  24. data/lib/mongoid_geospatial/version.rb +5 -0
  25. data/lib/mongoid_geospatial.rb +16 -0
  26. data/mongoid_geospatial.gemspec +28 -0
  27. data/spec/config/mongod.conf +3 -0
  28. data/spec/config/mongoid.yml +18 -0
  29. data/spec/functional/contexts/mongo_spec.rb +127 -0
  30. data/spec/functional/criterion/inclusion_spec.rb +356 -0
  31. data/spec/functional/mongoid_geospatial_spec.rb +54 -0
  32. data/spec/functional/spatial/geo_near_results_spec.rb +78 -0
  33. data/spec/models/account.rb +19 -0
  34. data/spec/models/acolyte.rb +9 -0
  35. data/spec/models/address.rb +62 -0
  36. data/spec/models/address_component.rb +5 -0
  37. data/spec/models/agent.rb +10 -0
  38. data/spec/models/alert.rb +5 -0
  39. data/spec/models/animal.rb +21 -0
  40. data/spec/models/answer.rb +4 -0
  41. data/spec/models/bar.rb +9 -0
  42. data/spec/models/birthday.rb +13 -0
  43. data/spec/models/book.rb +5 -0
  44. data/spec/models/business.rb +7 -0
  45. data/spec/models/callbacks.rb +57 -0
  46. data/spec/models/category.rb +13 -0
  47. data/spec/models/circus.rb +7 -0
  48. data/spec/models/comment.rb +13 -0
  49. data/spec/models/country_code.rb +6 -0
  50. data/spec/models/description.rb +11 -0
  51. data/spec/models/division.rb +5 -0
  52. data/spec/models/drug.rb +5 -0
  53. data/spec/models/employer.rb +5 -0
  54. data/spec/models/entry.rb +6 -0
  55. data/spec/models/event.rb +20 -0
  56. data/spec/models/farm.rb +10 -0
  57. data/spec/models/favorite.rb +6 -0
  58. data/spec/models/fruits.rb +11 -0
  59. data/spec/models/game.rb +18 -0
  60. data/spec/models/ghost.rb +7 -0
  61. data/spec/models/house.rb +4 -0
  62. data/spec/models/inheritance.rb +90 -0
  63. data/spec/models/league.rb +5 -0
  64. data/spec/models/location.rb +5 -0
  65. data/spec/models/login.rb +6 -0
  66. data/spec/models/membership.rb +4 -0
  67. data/spec/models/mixed_drink.rb +4 -0
  68. data/spec/models/name.rb +13 -0
  69. data/spec/models/namespacing.rb +11 -0
  70. data/spec/models/observed.rb +41 -0
  71. data/spec/models/override.rb +16 -0
  72. data/spec/models/owner.rb +6 -0
  73. data/spec/models/page.rb +5 -0
  74. data/spec/models/page_question.rb +4 -0
  75. data/spec/models/paranoid_post.rb +18 -0
  76. data/spec/models/parents.rb +32 -0
  77. data/spec/models/patient.rb +15 -0
  78. data/spec/models/person.rb +146 -0
  79. data/spec/models/pet.rb +7 -0
  80. data/spec/models/pet_owner.rb +6 -0
  81. data/spec/models/phone.rb +7 -0
  82. data/spec/models/player.rb +23 -0
  83. data/spec/models/post.rb +26 -0
  84. data/spec/models/preference.rb +9 -0
  85. data/spec/models/question.rb +8 -0
  86. data/spec/models/quiz.rb +6 -0
  87. data/spec/models/rating.rb +8 -0
  88. data/spec/models/river.rb +20 -0
  89. data/spec/models/role.rb +5 -0
  90. data/spec/models/service.rb +6 -0
  91. data/spec/models/shelf.rb +5 -0
  92. data/spec/models/slave_address_numbers.rb +14 -0
  93. data/spec/models/survey.rb +5 -0
  94. data/spec/models/tag.rb +6 -0
  95. data/spec/models/tracking_id_validation_history.rb +25 -0
  96. data/spec/models/translation.rb +5 -0
  97. data/spec/models/tree.rb +9 -0
  98. data/spec/models/user.rb +9 -0
  99. data/spec/models/user_account.rb +10 -0
  100. data/spec/models/vet_visit.rb +5 -0
  101. data/spec/models/video.rb +9 -0
  102. data/spec/models/wiki_page.rb +6 -0
  103. data/spec/spec_helper.rb +51 -0
  104. data/spec/support/authentication.rb +29 -0
  105. data/spec/unit/criterion/complex_spec.rb +15 -0
  106. data/spec/unit/criterion/inclusion_spec.rb +0 -0
  107. data/spec/unit/criterion/near_spatial_spec.rb +39 -0
  108. data/spec/unit/criterion/within_spatial_spec.rb +52 -0
  109. metadata +339 -0
@@ -0,0 +1,57 @@
1
+ class Artist
2
+ include Mongoid::Document
3
+ field :name
4
+ embeds_many :songs
5
+ embeds_many :labels
6
+
7
+ before_create :before_create_stub
8
+ after_create :create_songs
9
+ before_save :before_save_stub
10
+ before_destroy :before_destroy_stub
11
+
12
+ protected
13
+ def before_create_stub
14
+ true
15
+ end
16
+
17
+ def before_save_stub
18
+ true
19
+ end
20
+
21
+ def before_destroy_stub
22
+ true
23
+ end
24
+
25
+ def create_songs
26
+ 2.times { |n| songs.create!(:title => "#{n}") }
27
+ end
28
+ end
29
+
30
+ class Song
31
+ include Mongoid::Document
32
+ field :title
33
+ embedded_in :artist
34
+ end
35
+
36
+ class Label
37
+ include Mongoid::Document
38
+ field :name
39
+ embedded_in :artist
40
+ before_validation :cleanup
41
+
42
+ private
43
+ def cleanup
44
+ self.name = self.name.downcase.capitalize
45
+ end
46
+ end
47
+
48
+ class ValidationCallback
49
+ include Mongoid::Document
50
+ field :history, :type => Array, :default => []
51
+ validate do
52
+ self.history << :validate
53
+ end
54
+
55
+ before_validation { self.history << :before_validation }
56
+ after_validation { self.history << :after_validation }
57
+ end
@@ -0,0 +1,13 @@
1
+ class RootCategory
2
+ include Mongoid::Document
3
+ embeds_many :categories
4
+ end
5
+
6
+ class Category
7
+ include Mongoid::Document
8
+ embedded_in :root_category
9
+ embedded_in :category
10
+ embeds_many :categories
11
+
12
+ field :name
13
+ end
@@ -0,0 +1,7 @@
1
+ class Circus
2
+ include Mongoid::Document
3
+
4
+ field :name
5
+
6
+ embeds_many :animals
7
+ end
@@ -0,0 +1,13 @@
1
+ class Comment
2
+ include Mongoid::Document
3
+ include Mongoid::Versioning
4
+ include Mongoid::Timestamps
5
+ field :title, :type => String
6
+ field :text, :type => String
7
+ key :text, :type => String
8
+
9
+ referenced_in :movie
10
+ referenced_in :rating
11
+ validates :title, :presence => true
12
+ validates :movie, :rating, :associated => true
13
+ end
@@ -0,0 +1,6 @@
1
+ class CountryCode
2
+ include Mongoid::Document
3
+ field :code, :type => Integer
4
+ key :code
5
+ embedded_in :phone_number, :class_name => "Phone"
6
+ end
@@ -0,0 +1,11 @@
1
+ class Description
2
+ include Mongoid::Document
3
+
4
+ field :details
5
+
6
+ referenced_in :user
7
+ referenced_in :updater, :class_name => 'User'
8
+
9
+ validates :user, :associated => true
10
+ validates :details, :presence => true
11
+ end
@@ -0,0 +1,5 @@
1
+ class Division
2
+ include Mongoid::Document
3
+ field :name, :type => String
4
+ embedded_in :league
5
+ end
@@ -0,0 +1,5 @@
1
+ class Drug
2
+ include Mongoid::Document
3
+ field :name, :type => String
4
+ referenced_in :person
5
+ end
@@ -0,0 +1,5 @@
1
+ class Employer
2
+ def id
3
+ "1"
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ class Entry
2
+ include Mongoid::Document
3
+ field :title, :type => String
4
+ field :body, :type => String
5
+ recursively_embeds_many
6
+ end
@@ -0,0 +1,20 @@
1
+ class Event
2
+ include Mongoid::Document
3
+
4
+ field :title
5
+ field :date, :type => Date
6
+ references_and_referenced_in_many \
7
+ :administrators,
8
+ :class_name => 'Person',
9
+ :inverse_of => :administrated_events,
10
+ :dependent => :nullify
11
+ referenced_in :owner
12
+
13
+ def self.each_day(start_date, end_date)
14
+ groups = only(:date).asc(:date).where(:date.gte => start_date, :date.lte => end_date).group
15
+ groups.each do |hash|
16
+ yield(hash["date"], hash["group"])
17
+ end
18
+ end
19
+
20
+ end
@@ -0,0 +1,10 @@
1
+ class Farm
2
+ include Mongoid::Document
3
+ include Mongoid::Geospatial
4
+
5
+ field :name, :type => String
6
+ #field :location, :type => Point #, :spatial => true
7
+ field :area, :type => Polygon
8
+
9
+ #spatial_index :location
10
+ end
@@ -0,0 +1,6 @@
1
+ class Favorite
2
+ include Mongoid::Document
3
+ field :title
4
+ validates_uniqueness_of :title, :case_sensitive => false
5
+ embedded_in :perp, :inverse_of => :favorites
6
+ end
@@ -0,0 +1,11 @@
1
+ module Fruits
2
+ class Apple
3
+ include Mongoid::Document
4
+ references_many :bananas, :class_name => "Fruits::Banana"
5
+ end
6
+
7
+ class Banana
8
+ include Mongoid::Document
9
+ referenced_in :apple, :class_name => "Fruits::Apple"
10
+ end
11
+ end
@@ -0,0 +1,18 @@
1
+ class Game
2
+ include Mongoid::Document
3
+ field :high_score, :type => Integer, :default => 500
4
+ field :score, :type => Integer, :default => 0
5
+ field :name
6
+ referenced_in :person, :index => true
7
+ references_one :video, :validate => false
8
+ accepts_nested_attributes_for :person
9
+ cache
10
+
11
+ validates_format_of :name, :without => /\$\$\$/
12
+
13
+ attr_protected :_id
14
+
15
+ set_callback(:initialize, :after) do |document|
16
+ write_attribute("name", "Testing") unless name
17
+ end
18
+ end
@@ -0,0 +1,7 @@
1
+ class Ghost
2
+ include Mongoid::Document
3
+
4
+ field :name, :type => String
5
+
6
+ referenced_in :movie, :autosave => true
7
+ end
@@ -0,0 +1,4 @@
1
+ class House
2
+ include Mongoid::Document
3
+ field :name, :type => String
4
+ end
@@ -0,0 +1,90 @@
1
+ class Canvas
2
+ include Mongoid::Document
3
+ field :name
4
+ embeds_many :shapes
5
+ embeds_one :writer
6
+ embeds_one :palette
7
+
8
+ def render
9
+ shapes.each { |shape| render }
10
+ end
11
+ end
12
+
13
+ class Browser < Canvas
14
+ field :version, :type => Integer
15
+ def render; end
16
+ end
17
+
18
+ class Firefox < Browser
19
+ field :user_agent
20
+ def render; end
21
+ end
22
+
23
+ class Shape
24
+ include Mongoid::Document
25
+ field :x, :type => Integer, :default => 0
26
+ field :y, :type => Integer, :default => 0
27
+
28
+ embedded_in :canvas
29
+
30
+ def render; end
31
+ end
32
+
33
+ class Square < Shape
34
+ field :width, :type => Integer, :default => 0
35
+ field :height, :type => Integer, :default => 0
36
+ end
37
+
38
+ class Circle < Shape
39
+ field :radius, :type => Integer, :default => 0
40
+ end
41
+
42
+ class Writer
43
+ include Mongoid::Document
44
+ field :speed, :type => Integer, :default => 0
45
+
46
+ embedded_in :canvas
47
+
48
+ def write; end
49
+ end
50
+
51
+ class HtmlWriter < Writer
52
+ def write; end
53
+ end
54
+
55
+ class PdfWriter < Writer
56
+ def write; end
57
+ end
58
+
59
+ class Palette
60
+ include Mongoid::Document
61
+ embedded_in :canvas
62
+ embeds_many :tools
63
+ end
64
+
65
+ class Tool
66
+ include Mongoid::Document
67
+ embedded_in :palette
68
+ end
69
+
70
+ class Pencil < Tool; end
71
+
72
+ class Eraser < Tool; end
73
+
74
+ ########################################
75
+ # These are for references relationships
76
+ ########################################
77
+ class ShippingContainer
78
+ include Mongoid::Document
79
+ references_many :vehicles
80
+ end
81
+ class Vehicle
82
+ include Mongoid::Document
83
+ referenced_in :shipping_container
84
+ end
85
+ class Bed; end
86
+ class Car < Vehicle; end
87
+ class Truck < Vehicle
88
+ embeds_one :bed
89
+ end
90
+
@@ -0,0 +1,5 @@
1
+ class League
2
+ include Mongoid::Document
3
+ embeds_many :divisions
4
+ accepts_nested_attributes_for :divisions, :allow_destroy => true
5
+ end
@@ -0,0 +1,5 @@
1
+ class Location
2
+ include Mongoid::Document
3
+ field :name
4
+ embedded_in :address
5
+ end
@@ -0,0 +1,6 @@
1
+ class Login
2
+ include Mongoid::Document
3
+ field :username
4
+ key :username
5
+ validates_uniqueness_of :username
6
+ end
@@ -0,0 +1,4 @@
1
+ class Membership
2
+ include Mongoid::Document
3
+ embedded_in :account
4
+ end
@@ -0,0 +1,4 @@
1
+ class MixedDrink
2
+ include Mongoid::Document
3
+ field :name
4
+ end
@@ -0,0 +1,13 @@
1
+ class Name
2
+ include Mongoid::Document
3
+ field :first_name
4
+ field :last_name
5
+ field :parent_title
6
+ key :first_name, :last_name
7
+ embeds_many :translations
8
+ embedded_in :namable, :polymorphic => true
9
+
10
+ def set_parent=(set = false)
11
+ self.parent_title = namable.title if set
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ module Medical
2
+ class Patient
3
+ include Mongoid::Document
4
+ field :name
5
+ embeds_many :prescriptions, :class_name => "Medical::Prescription"
6
+ end
7
+ class Prescription
8
+ include Mongoid::Document
9
+ field :name
10
+ end
11
+ end
@@ -0,0 +1,41 @@
1
+ class Actor
2
+ include Mongoid::Document
3
+ field :name
4
+ end
5
+
6
+ class Actress < Actor
7
+ end
8
+
9
+ class ActorObserver < Mongoid::Observer
10
+ attr_reader :last_after_create_record
11
+
12
+ def after_create(record)
13
+ @last_after_create_record = record
14
+ end
15
+ end
16
+
17
+ class CallbackRecorder < Mongoid::Observer
18
+ observe :actor
19
+
20
+ attr_reader :last_callback, :call_count, :last_record
21
+
22
+ def initialize
23
+ reset
24
+ super
25
+ end
26
+
27
+ def reset
28
+ @last_callback = nil
29
+ @call_count = Hash.new(0)
30
+ @last_record = {}
31
+ end
32
+
33
+ Mongoid::Callbacks::CALLBACKS.each do |callback|
34
+ define_method(callback) do |record, &block|
35
+ @last_callback = callback
36
+ @call_count[callback] += 1
37
+ @last_record[callback] = record
38
+ block ? block.call : true
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,16 @@
1
+ class Override
2
+ include Mongoid::Document
3
+
4
+ def self.public_method
5
+ end
6
+
7
+ protected
8
+
9
+ def self.protected_method
10
+ end
11
+
12
+ private
13
+
14
+ def self.private_method
15
+ end
16
+ end
@@ -0,0 +1,6 @@
1
+ class Owner
2
+ include Mongoid::Document
3
+ field :name
4
+ references_many :events
5
+ embeds_many :birthdays
6
+ end
@@ -0,0 +1,5 @@
1
+ class Page
2
+ include Mongoid::Document
3
+ embedded_in :quiz
4
+ embeds_many :page_questions
5
+ end
@@ -0,0 +1,4 @@
1
+ class PageQuestion
2
+ include Mongoid::Document
3
+ embedded_in :page
4
+ end
@@ -0,0 +1,18 @@
1
+ class ParanoidPost
2
+ include Mongoid::Document
3
+ include Mongoid::Versioning
4
+ include Mongoid::Timestamps
5
+ include Mongoid::Paranoia
6
+ field :title
7
+ referenced_in :person
8
+
9
+ references_and_referenced_in_many :tags
10
+
11
+ named_scope :recent, where(:created_at => { "$lt" => Time.now, "$gt" => 30.days.ago })
12
+
13
+ class << self
14
+ def old
15
+ where(:created_at => { "$lt" => 30.days.ago })
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,32 @@
1
+ class ParentDoc
2
+ include Mongoid::Document
3
+
4
+ embeds_many :child_docs
5
+
6
+ field :statistic
7
+ field :children_order, :type => Array, :default => [] # hold all the children's id
8
+ end
9
+
10
+
11
+ class ChildDoc
12
+ include Mongoid::Document
13
+
14
+ embedded_in :parent_doc
15
+
16
+ attr_writer :position
17
+
18
+ after_save :update_position
19
+
20
+ def position
21
+ exsited_position = parent_doc.children_order.index(id)
22
+ exsited_position ? exsited_position + 1 : parent_doc.aspects.size
23
+ end
24
+
25
+ def update_position
26
+ if @position && (@position.to_i > 0)
27
+ parent_doc.children_order.delete(id)
28
+ parent_doc.children_order.insert(@position.to_i - 1, id)
29
+ parent_doc.save
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,15 @@
1
+ class Email
2
+ include Mongoid::Document
3
+ field :address
4
+ validates_uniqueness_of :address
5
+ embedded_in :patient
6
+ end
7
+
8
+ class Patient
9
+ include Mongoid::Document
10
+ field :title
11
+ store_in :inpatient
12
+ embeds_many :addresses, :as => :addressable
13
+ embeds_one :email
14
+ validates_presence_of :title, :on => :create
15
+ end
@@ -0,0 +1,146 @@
1
+ class Person
2
+ include Mongoid::Document
3
+ include Mongoid::MultiParameterAttributes
4
+ include Mongoid::Timestamps
5
+ include Mongoid::Versioning
6
+
7
+ attr_accessor :mode
8
+
9
+ class_attribute :somebody_elses_important_class_options
10
+ self.somebody_elses_important_class_options = { :keep_me_around => true }
11
+
12
+ field :title
13
+ field :terms, :type => Boolean
14
+ field :pets, :type => Boolean, :default => false
15
+ field :age, :type => Integer, :default => 100
16
+ field :dob, :type => Date
17
+ field :employer_id
18
+ field :lunch_time, :type => Time
19
+ field :aliases, :type => Array
20
+ field :map, :type => Hash
21
+ field :score, :type => Integer
22
+ field :blood_alcohol_content, :type => Float, :default => lambda{ 0.0 }
23
+ field :last_drink_taken_at, :type => Date, :default => lambda { 1.day.ago.in_time_zone("Alaska") }
24
+ field :ssn
25
+ field :owner_id, :type => Integer
26
+ field :security_code
27
+ field :reading, :type => Object
28
+ field :bson_id, :type => BSON::ObjectId
29
+
30
+ index :age
31
+ index :addresses
32
+ index :dob
33
+ index :name
34
+ index :title
35
+ index :ssn, :unique => true
36
+
37
+ validates_format_of :ssn, :without => /\$\$\$/
38
+
39
+ attr_reader :rescored
40
+
41
+ attr_protected :security_code, :owner_id
42
+
43
+ embeds_many :favorites, :order => :title.desc, :inverse_of => :perp
44
+ embeds_many :videos, :order => [[ :title, :asc ]]
45
+ embeds_many :phone_numbers, :class_name => "Phone"
46
+ embeds_many :addresses, :as => :addressable do
47
+ def extension
48
+ "Testing"
49
+ end
50
+ def find_by_street(street)
51
+ @target.select { |doc| doc.street == street }
52
+ end
53
+ end
54
+ embeds_many :address_components
55
+ embeds_many :services
56
+
57
+ embeds_one :pet, :class_name => "Animal"
58
+ embeds_one :name, :as => :namable do
59
+ def extension
60
+ "Testing"
61
+ end
62
+ def dawkins?
63
+ first_name == "Richard" && last_name == "Dawkins"
64
+ end
65
+ end
66
+ embeds_one :quiz
67
+
68
+ accepts_nested_attributes_for :addresses
69
+ accepts_nested_attributes_for :name, :update_only => true
70
+ accepts_nested_attributes_for :pet, :allow_destroy => true
71
+ accepts_nested_attributes_for :game, :allow_destroy => true
72
+ accepts_nested_attributes_for :favorites, :allow_destroy => true, :limit => 5
73
+ accepts_nested_attributes_for :posts
74
+ accepts_nested_attributes_for :preferences
75
+ accepts_nested_attributes_for :quiz
76
+
77
+ references_one :game, :dependent => :destroy do
78
+ def extension
79
+ "Testing"
80
+ end
81
+ end
82
+
83
+ references_many \
84
+ :posts,
85
+ :dependent => :delete,
86
+ :order => :rating.desc do
87
+ def extension
88
+ "Testing"
89
+ end
90
+ end
91
+ references_many :paranoid_posts
92
+ references_and_referenced_in_many \
93
+ :preferences,
94
+ :index => true,
95
+ :dependent => :nullify,
96
+ :autosave => true,
97
+ :order => :value.desc
98
+ references_and_referenced_in_many :user_accounts
99
+ references_and_referenced_in_many :houses
100
+
101
+ references_many :drugs, :autosave => true
102
+ references_one :account, :autosave => true
103
+
104
+ references_and_referenced_in_many \
105
+ :administrated_events,
106
+ :class_name => 'Event',
107
+ :inverse_of => :administrators,
108
+ :dependent => :nullify
109
+
110
+ scope :minor, where(:age.lt => 18)
111
+ scope :without_ssn, without(:ssn)
112
+
113
+ def score_with_rescoring=(score)
114
+ @rescored = score.to_i + 20
115
+ self.score_without_rescoring = score
116
+ end
117
+
118
+ alias_method_chain :score=, :rescoring
119
+
120
+ def update_addresses
121
+ addresses.each do |address|
122
+ address.street = "Updated Address"
123
+ end
124
+ end
125
+
126
+ def employer=(emp)
127
+ self.employer_id = emp.id
128
+ end
129
+
130
+ class << self
131
+ def accepted
132
+ criteria.where(:terms => true)
133
+ end
134
+ def knight
135
+ criteria.where(:title => "Sir")
136
+ end
137
+ def old
138
+ criteria.where(:age => { "$gt" => 50 })
139
+ end
140
+ end
141
+
142
+ end
143
+
144
+ class Doctor < Person
145
+ field :specialty
146
+ end
@@ -0,0 +1,7 @@
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
+ end