ephemeral
Ephemeral brings ORM-like functionality to non-persisted objects. The anticipated use case is for an application that consumes an API and materializes one or more collections of objects from a JSON response or XML response. Another frequent use involves providing relations and scopes to POROs (plain old Ruby objects).
Example the First
Let's say that we have an API server that stores information about the inventions of Nikola Tesla. We have another application that consumes this information. Our initial call to the API retrieves a list of all of his inventions, but we want to display them in categories. Assuming that we materialize each invention into an Invention object, the Ephemeral wiring is simple. Here's our sample Invention class:
class Invention
include Ephemeral::Base
attr_accessor :name, :description, :category, :stolen_by_edison
scope :telegraphy, {:category => 'Telegraphy'}
scope :electrical, {:category => 'Electrical'}
scope :mechanical, {:category => 'Mechanical'}
scope :stolen, {:stolen_by_edison => true }
scope :by_name, lambda{|name| where :name => name}
def initialize(args={})
# Marshal object based on your API
end
end
We can now easily find all of Tesla's telegraphy inventions that were shamelessly stolen by Thomas Edison:
Invention.telegraphy.stolen
Example the Second
Our Tesla site has really taken off, and now we want to introduce another object, each instance of which represents a period in Tesla's life. We want to associate inventions with each of these periods. Again, rather than building complex logic into our API request, we can simply fetch a mass of data and build our relationships on the consumer application side using Ephemeral:
class Period
include Ephemeral::Base
attr_accessor :name, :start_year, :end_year
collects :inventions
def initialize(args={})
# Marshal object based on your API, including setting up Invention objects
end
end
Now we can filter inventions on the consumer side:
period = Period.where(:name => 'Early Years')
inventions = period.inventions.mechanical
favorite = inventions.find(:name => 'Doomsday Device')
More Examples?
For a more complete example, please refer to the specs.