Ohm lets you define an index field to make queries faster. For example, the Character class defines name_upcase
as an index, because we quite frequently look up characters by name.
Defining an index lets you use the built-in Ohm find
method on that field. For example: Character.find(name_upcase: "BOB")
.
If you try to use find
on a field that isn’t indexed, you’ll get a Ohm::IndexNotFound
error.
Character.all.select { |c| c.some_field == 'some_value' }
.
Collections do some auto-magic indexing for you, so you can also get the Ohm::IndexNotFound
error when the name of the collection and reference don’t match. For example:
class Photo < Ohm::Model
reference :photo_album, "PhotoAlbum"
end
class PhotoAlbum < Ohm::Model
collection :photos, "Photo"
end
The reference above needs to be named photo_album
for the auto-indexing to work right, because that matches the name of the other class (PhotoAlbum). If you just name it album
, you’ll get the index error.