Goodyear
Adds ActiveRecord-like query interface to Tire.
Installation
Add this line to your application's Gemfile:
gem 'goodyear'
And then execute:
$ bundle
Or install it yourself as:
$ gem install goodyear
Usage
class SomeModel < Tire
include Goodyear::ElasticQuery
end
Better persistence via dynamic attributes.
Including Goodyear::Persistence in your model means you don't have to worry about defining everything with Tire's #property method.
class SomeModel < Tire
include Goodyear::ElasticQuery
include Goodyear::Persistence
end
Query Builder
where()
SomeModel.where( published: true, topic: "goats")
or()
SomeModel.where(status: 'inactive').or.where( retired: true)
sort()
Orders results by field
SomeModel.where( published: true, name: "Candy").sort(:score, :desc)
fields()
Specify fields to include in results
SomeModel.where( published: true, name: "Candy").fields(:published, :name, :score)
first()
Sets size to 1 and fetches the first result. Returns SomeModel
SomeModel.where( published: true, name: "Candy").first
last()
Returns the last result
SomeModel.where( published: true).last
fetch()
Exectues the query and returns TireCollection
SomeModel.where( published: true).size(100).sort(:score, :desc)
routing(id)
Sets routing to id in search options and returns SomeModel
SomeModel.routing(10).where( published: true)
count
Sets search_type to 'count' in search options, fetches and returns total
SomeModel.where( published: true).count
search_options(options = {})
Sets search options. Overwrites previously set values
SomeModel.(routing: 1, search_type: 'count').where( published: true).fetch
Scopes
Add chainable scopes just like you do in ActiveRecord.
class SomeModel
include Tire::Model::Persistence
include ActiveRecord::Callbacks
include Goodyear::ElasticQuery
include Goodyear::Persistence
...
scope :published, -> { where published: true }
end
Facets
Terms facet
SomeModel.where(created_at: 1.year.ago).facet('top_users') { terms 'users', size: 50 }
Or maybe a date histogram facet:
SomeModel.facet('stats') { date :created_at, interval: "1m",
pre_zone_adjust_large_interval: true,
time_zone: "-0500"}
Query Filters
SomeModel.where(width: 10).filter(:range, {height: { gte: 10, lte: 200} })
There's also a convenience method for Exists filters.
SomeModel.has_field?(:width).where(width:10)
Contributing
- Fork it
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create new Pull Request