Class: CouchRest::Model::Collection::CollectionProxy

Inherits:
Object
  • Object
show all
Defined in:
lib/couchrest/model/collection.rb

Constant Summary collapse

DEFAULT_PAGE =
1
DEFAULT_PER_PAGE =
30

Instance Method Summary collapse

Constructor Details

#initialize(database, design_doc, view_name, view_options = {}, container_class = nil, query_type = :view) ⇒ CollectionProxy

Create a new CollectionProxy to represent the specified view. If a container class is specified, the proxy will create an object of the given type for each row that comes back from the view. If no container class is specified, the raw results are returned.

The CollectionProxy provides support for paginating over a collection via the paginate, and paginated_each methods.

Raises:

  • (ArgumentError)


119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/couchrest/model/collection.rb', line 119

def initialize(database, design_doc, view_name, view_options = {}, container_class = nil, query_type = :view)
  raise ArgumentError, "database is a required parameter" if database.nil?

  @database = database
  @container_class = container_class
  @query_type = query_type

  strip_pagination_options(view_options)
  @view_options = view_options

  if design_doc.class == Design
    @view_name = "#{design_doc.name}/#{view_name}"
  else
    @view_name = "#{design_doc}/#{view_name}"
  end
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args) ⇒ Object (private)



181
182
183
184
185
186
187
188
189
# File 'lib/couchrest/model/collection.rb', line 181

def method_missing(method, *args)
  if load_target
    if block_given?
      @target.send(method, *args)  { |*block_args| yield(*block_args) }
    else
      @target.send(method, *args)
    end
  end
end

Instance Method Details

#===(other) ⇒ Object

Explicitly proxy === because the instance method removal above doesn’t catch it.



174
175
176
177
# File 'lib/couchrest/model/collection.rb', line 174

def ===(other)
  load_target
  other === @target
end

#paginate(options = {}) ⇒ Object

See Collection.paginate



137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/couchrest/model/collection.rb', line 137

def paginate(options = {})
  page, per_page = parse_options(options)
  results = @database.send(@query_type, @view_name, pagination_options(page, per_page))
  remember_where_we_left_off(results, page)
  instances = convert_to_container_array(results)

  begin
    if Kernel.const_get('WillPaginate')
      total_rows = results['total_rows'].to_i
      paginated = WillPaginate::Collection.create(page, per_page, total_rows) do |pager|
        pager.replace(instances)
      end
      return paginated
    end
  rescue NameError
    # When not using will_paginate, not much we could do about this. :x
  end
  return instances
end

#paginated_each(options = {}, &block) ⇒ Object

See Collection.paginated_each



158
159
160
161
162
163
164
165
166
# File 'lib/couchrest/model/collection.rb', line 158

def paginated_each(options = {}, &block)
  page, per_page = parse_options(options)

  begin
    collection = paginate({:page => page, :per_page => per_page})
    collection.each(&block)
    page += 1
  end until collection.size < per_page
end

#proxy_respond_to?Object



106
# File 'lib/couchrest/model/collection.rb', line 106

alias_method :proxy_respond_to?, :respond_to?

#respond_to?(*args) ⇒ Boolean

Returns:

  • (Boolean)


168
169
170
# File 'lib/couchrest/model/collection.rb', line 168

def respond_to?(*args)
  proxy_respond_to?(*args) || (load_target && @target.respond_to?(*args))
end