it adds optimistic persistence support to DataMapper and ActveRecord using the updated_at property/attribute which is automatically updated on any change of the model (for datamapper you need dm-timestamps for that). to load a model use optimistic_get
/optimistic_get!
/optimistic_find
respectively where the first argument is the last updated_at
value which the client has. if the client data is uptodate then the optimistic_XYZ
method will return the database entity otherwise raise an exception or return nil respectively.
just include require 'ixtlan/datamapper/optimistic'
and have model like:
class User
include DataMapper::Resource
property :id, Serial
property :name, String
timestamps :at
end
you need the timestamps to get it to work since the updated_at property will be used to determine if the object is stale or not.
now you get the object in an optimistic manner
User.optimistic_get!( updated_at, id )
User.optimistic_get( updated_at, id )
if will raise an Ixtlan::DataMapper::StaleObjectException in case the object with the given id
exists but does carry a different updated_at timestamp. otherwise the optimistic_get
and optimistic_get!
behave the same as get
and get!
.
now you get the object in an conditional manner
User.conditinal_get!( updated_at, id )
User.conditional_get( updated_at, id )
it the User
when the updated_at does not match. when it matches it returns false
. in case the id
does not exist, it will return either nil of DataMapper::ObjectNotFoundError. this allows constructs like
if u = User.conditinal_get!( request.last_modified, id )
response.last_modified = u.updated_at
response.write ....
else
# in case request.last_modified was nil
response.last_modified = u.updated_at
end
class Group
include DataMapper::Resource
include Ixtlan::DataMapper::Immutable
property :id, Serial
property :name, String
end
you can create and delete those object but any attempt to change it the name ends in validation error.
just convenient file to setup datamapper to use UTC timestamps
the collection is virtus object which helps to transport collections of DataMapper objects around. it has the total_count
and an offset
along an accessor for the list. the contructor deals with offset and limit on the datamapper query.
class UserCollection < Ixtlan::DataMapper::Collection
attribute :users, Array[User]
def data=( d )
self.users = d
end
end
this
UserCollection.new( User.all( :name.like => 'a%' ), 20, 10 )
will return 10 users starting with 'a' starting with 20th user from all possible users (with 'a').
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Added some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request
enjoy :)