couchrest-type
This commit is contained in:
parent
8cfed5af4f
commit
03f4169350
|
@ -23,7 +23,7 @@ module CouchRest
|
||||||
# view_by :tags,
|
# view_by :tags,
|
||||||
# :map =>
|
# :map =>
|
||||||
# "function(doc) {
|
# "function(doc) {
|
||||||
# if (doc.type == 'Article' && doc.tags) {
|
# if (doc['couchrest-type'] == 'Article' && doc.tags) {
|
||||||
# doc.tags.forEach(function(tag){
|
# doc.tags.forEach(function(tag){
|
||||||
# emit(tag, 1);
|
# emit(tag, 1);
|
||||||
# });
|
# });
|
||||||
|
@ -50,16 +50,12 @@ module CouchRest
|
||||||
# instantiates the hash by converting all the keys to strings.
|
# instantiates the hash by converting all the keys to strings.
|
||||||
def initialize keys = {}
|
def initialize keys = {}
|
||||||
super()
|
super()
|
||||||
if self.class.default
|
apply_defaults
|
||||||
self.class.default.each do |k,v|
|
|
||||||
self[k.to_s] = v
|
|
||||||
end
|
|
||||||
end
|
|
||||||
keys.each do |k,v|
|
keys.each do |k,v|
|
||||||
self[k.to_s] = v
|
self[k.to_s] = v
|
||||||
end
|
end
|
||||||
unless self['_id'] && self['_rev']
|
unless self['_id'] && self['_rev']
|
||||||
init_doc
|
self['couchrest-type'] = self.class.to_s
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -86,7 +82,8 @@ module CouchRest
|
||||||
end
|
end
|
||||||
|
|
||||||
def cast field, opts = {}
|
def cast field, opts = {}
|
||||||
|
@casts ||= {}
|
||||||
|
@casts[field.to_s] = opts
|
||||||
end
|
end
|
||||||
|
|
||||||
# Defines methods for reading and writing from fields in the document.
|
# Defines methods for reading and writing from fields in the document.
|
||||||
|
@ -178,7 +175,7 @@ module CouchRest
|
||||||
# view_by :tags,
|
# view_by :tags,
|
||||||
# :map =>
|
# :map =>
|
||||||
# "function(doc) {
|
# "function(doc) {
|
||||||
# if (doc.type == 'Post' && doc.tags) {
|
# if (doc['couchrest-type'] == 'Post' && doc.tags) {
|
||||||
# doc.tags.forEach(function(tag){
|
# doc.tags.forEach(function(tag){
|
||||||
# emit(doc.tag, 1);
|
# emit(doc.tag, 1);
|
||||||
# });
|
# });
|
||||||
|
@ -194,7 +191,7 @@ module CouchRest
|
||||||
# function:
|
# function:
|
||||||
#
|
#
|
||||||
# function(doc) {
|
# function(doc) {
|
||||||
# if (doc.type == 'Post' && doc.date) {
|
# if (doc['couchrest-type'] == 'Post' && doc.date) {
|
||||||
# emit(doc.date, null);
|
# emit(doc.date, null);
|
||||||
# }
|
# }
|
||||||
# }
|
# }
|
||||||
|
@ -243,7 +240,7 @@ module CouchRest
|
||||||
key_emit = doc_keys.length == 1 ? "#{doc_keys.first}" : "[#{doc_keys.join(', ')}]"
|
key_emit = doc_keys.length == 1 ? "#{doc_keys.first}" : "[#{doc_keys.join(', ')}]"
|
||||||
map_function = <<-JAVASCRIPT
|
map_function = <<-JAVASCRIPT
|
||||||
function(doc) {
|
function(doc) {
|
||||||
if (doc.type == '#{type}' && #{key_protection}) {
|
if (doc['couchrest-type'] == '#{type}' && #{key_protection}) {
|
||||||
emit(#{key_emit}, null);
|
emit(#{key_emit}, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -391,8 +388,12 @@ module CouchRest
|
||||||
result['ok']
|
result['ok']
|
||||||
end
|
end
|
||||||
|
|
||||||
def init_doc
|
def apply_defaults
|
||||||
self['type'] = self.class.to_s
|
if self.class.default
|
||||||
|
self.class.default.each do |k,v|
|
||||||
|
self[k.to_s] = v
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
include ::Extlib::Hook
|
include ::Extlib::Hook
|
||||||
|
|
|
@ -14,6 +14,15 @@ class WithTemplate < CouchRest::Model
|
||||||
key_accessor :preset
|
key_accessor :preset
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class Question < CouchRest::Model
|
||||||
|
key_accessor :q, :a
|
||||||
|
end
|
||||||
|
|
||||||
|
class Course < CouchRest::Model
|
||||||
|
key_accessor :title
|
||||||
|
cast :questions, :as => [Question]
|
||||||
|
end
|
||||||
|
|
||||||
class Article < CouchRest::Model
|
class Article < CouchRest::Model
|
||||||
use_database CouchRest.database!('http://localhost:5984/couchrest-model-test')
|
use_database CouchRest.database!('http://localhost:5984/couchrest-model-test')
|
||||||
unique_id :slug
|
unique_id :slug
|
||||||
|
@ -24,7 +33,7 @@ class Article < CouchRest::Model
|
||||||
view_by :tags,
|
view_by :tags,
|
||||||
:map =>
|
:map =>
|
||||||
"function(doc) {
|
"function(doc) {
|
||||||
if (doc.type == 'Article' && doc.tags) {
|
if (doc['couchrest-type'] == 'Article' && doc.tags) {
|
||||||
doc.tags.forEach(function(tag){
|
doc.tags.forEach(function(tag){
|
||||||
emit(tag, 1);
|
emit(tag, 1);
|
||||||
});
|
});
|
||||||
|
@ -135,6 +144,37 @@ describe CouchRest::Model do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "getting a model with a subobjects array" do
|
||||||
|
before(:all) do
|
||||||
|
course_doc = {
|
||||||
|
"title" => "Metaphysics 200",
|
||||||
|
"questions" => [
|
||||||
|
{
|
||||||
|
"q" => "Carve the ___ of reality at the ___.",
|
||||||
|
"a" => ["beast","joints"]
|
||||||
|
},{
|
||||||
|
"q" => "Who layed the smack down on Leibniz's Law?",
|
||||||
|
"a" => "Willard Van Orman Quine"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
r = Course.database.save course_doc
|
||||||
|
@course = Course.get r['id']
|
||||||
|
end
|
||||||
|
it "should load the course" do
|
||||||
|
@course.title.should == "Metaphysics 200"
|
||||||
|
end
|
||||||
|
it "should instantiate them as such" do
|
||||||
|
@course["questions"][0].a[0].should == "beast"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "getting a model with a subobject field" do
|
||||||
|
it "should instantiate it as such" do
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "saving a model" do
|
describe "saving a model" do
|
||||||
before(:all) do
|
before(:all) do
|
||||||
@obj = Basic.new
|
@obj = Basic.new
|
||||||
|
@ -158,7 +198,7 @@ describe CouchRest::Model do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should set the type" do
|
it "should set the type" do
|
||||||
@obj['type'].should == 'Basic'
|
@obj['couchrest-type'].should == 'Basic'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue