Couchbase Model
This library allows to declare models for couchbase gem.
SUPPORT
If you found an issue, please file it in our JIRA. Also you are
always welcome on #libcouchbase
channel at freenode.net IRC servers.
Documentation: http://rdoc.info/gems/couchbase-model
Rails integration
To generate config you can use rails generate couchbase:config
:
$ rails generate couchbase:config
create config/couchbase.yml
It will generate this config/couchbase.yml
for you:
common: &common
hostname: localhost
port: 8091
username:
password:
pool: default
development:
<<: *common
bucket: couchbase_tinyurl_development
test:
<<: *common
bucket: couchbase_tinyurl_test
# set these environment variables on your production server
production:
hostname: <%= ENV['COUCHBASE_HOST'] %>
port: <%= ENV['COUCHBASE_PORT'] %>
username: <%= ENV['COUCHBASE_USERNAME'] %>
password: <%= ENV['COUCHBASE_PASSWORD'] %>
pool: <%= ENV['COUCHBASE_POOL'] %>
bucket: <%= ENV['COUCHBASE_BUCKET'] %>
Examples
require 'couchbase/model'
class Post < Couchbase::Model
attribute :title
attribute :body
attribute :draft
end
p = Post.new(:id => 'hello-world',
:title => 'Hello world',
:draft => true)
p.save
p = Post.find('hello-world')
p.body = "Once upon the times...."
p.save
p.update(:draft => false)
Post.bucket.get('hello-world') #=> {"title"=>"Hello world", "draft"=>false,
# "body"=>"Once upon the times...."}
You can also let the library generate the unique identifier for you:
p = Post.create(:title => 'How to generate ID',
:body => 'Open up the editor...')
p.id #=> "74f43c3116e788d09853226603000809"
There are several algorithms available. By default it use :sequential
algorithm, but you can change it to more suitable one for you:
class Post < Couchbase::Model
attribute :title
attribute :body
attribute :draft
uuid_algorithm :random
end
You can define connection options on per model basis:
class Post < Couchbase::Model
attribute :title
attribute :body
attribute :draft
connect :port => 80, :bucket => 'blog'
end
Validations
There are all methods from ActiveModel::Validations accessible in context of rails application:
class Comment < Couchbase::Model
attribute :author, :body
validates_presence_of :author, :body
end
Views (aka Map/Reduce indexes)
Views are stored in models directory in subdirectory named after the
model (to be precious design_document
attribute of the model class).
Here is an example of directory layout for Link
model with three
views.
.
└── app
└── models
├── link
│ ├── total_count
│ │ ├── map.js
│ │ └── reduce.js
│ ├── by_created_at
│ │ └── map.js
│ └── by_view_count
│ └── map.js
└── link.rb
To generate view you can use yet another generator rails generate couchbase:view DESIGNDOCNAME VIEWNAME
. For example how total_count
view could be generated:
$ rails generate couchbase:view link total_count
The generated files contains useful info and links about how to write map and reduce functions, you can take a look at them in the templates directory.
In the model class you should declare accessible views:
class Post < Couchbase::Model
attribute :title
attribute :body
attribute :draft
attribute :view_count
attribute :created_at, :default => lambda { Time.now }
view :total_count, :by_created_at, :by_view_count
end
And request them later:
Post.by_created_at(:include_docs => true).each do |post|
puts post.title
end
Post.by_view_count(:include_docs => true).group_by(&:view_count) do |count, posts|
p "#{count} -> #{posts.map{|pp| pp.inspect}.join(', ')}"
end