RelaxDB documents are now directly backed by the hash created by
JSON.parse. This offers a significant real-world performance improvement. This change means that instance variables that map to CouchDB properties should no longer be manipulated directly – doing this was always a little risky as the behaviour was never firmly defined. But, if you need to preserve such behaviour use
data['my_prop_name'] instead of the
my_prop_name instance variable.
The methods has_one, has_n and references_many have been removed. Although convenient, in practice, their use contributed to non-idiomatic usage of CouchDB. Storing an array of document ids may be a suitable replacement for references_many as the underlying docs can be retrieved in a single query.
RelaxDB 0.4 contains a number of breaking changes. However, most clients should be able to upgrade smoothly.
The largest change concerns automatic view generation. Prior to 0.4 an invocation of
emit(doc.foo, doc);. This idiom is generally advised against. It makes view generation comparatively slow, and in particular, causes performance issues for large databases. In 0.4
view_by :foo now creates a map of the form
emit(doc.foo, 1); and creates a reduce using the
If view size isn’t an issue for you, legacy behaviour can be preserved by replacing all invocations of
view_docs_by. Similarly, any invocations of
RelaxDB.view against auto-generated views should be replaced with
view_by invocations no longer add paginate methods to the current class. Paginating over these views should be done with one of
The standard idiom for saving autogenerated views is now
RelaxDB.enable_view_creation require File.dirname(__FILE__) + '/spec_models.rb' RelaxDB::View.design_doc.save
The explicit call to
.save is new in 0.4. It was added to enable creating all views in a single request, rather than requiring a request per view.
The standard paginate method makes three requests against CouchDB. One to retrieve the docs and a further two to determine if next and prev links should exist. In some instances it may be preferable to save two requests and present potentially spurious pagination links. The qpaginate method does just this.