module Cequel::Record::Finders
Cequel
provides finder methods to construct scopes for looking up records by primary key or secondary indexed columns.
@example Example model class
class Post key :blog_subdomain, :text key :id, :timeuuid, auto: true column :title, :text column :body, :text column :author_id, :uuid, index: true # this column has a secondary # index end
@example Using some but not all primary key columns
# return an Array of all posts with given subdomain (greedy load) Post.find_all_by_blog_subdomain(subdomain) # return a {RecordSet} of all posts with the given subdomain (lazy # load) Post.with_subdomain(subdomain)
@example Using all primary key columns
# return the first post with the given subdomain and id, or nil if none Post.find_by_blog_subdomain_and_id(subdomain, id) # return a record set to the post with the given subdomain and id # (one element array if exists, empty array otherwise) Post.with_blog_subdomain_and_id(subdomain, id)
@example Chaining
# return the first post with the given subdomain and id, or nil if none # Note that find_by_id can only be called on a scope that already has a # filter value for blog_subdomain Post.with_blog_subdomain(subdomain).find_by_id(id)
@example Using a secondary index
# return the first record with the author_id Post.find_by_author_id(id) # return an Array of all records with the author_id Post.find_all_by_author_id(id) # return a RecordSet scoped to the author_id Post.with_author_id(id)
@since 1.2.0
Private Instance Methods
column(name, type, options = {})
click to toggle source
Calls superclass method
# File lib/cequel/record/finders.rb, line 64 def column(name, type, options = {}) super if options[:index] def_finder('with', [name]) def_finder('find_by', [name], '.first') def_finder('find_all_by', [name], '.entries') end end
def_finder(method_prefix, column_names, scope_operation = '')
click to toggle source
# File lib/cequel/record/finders.rb, line 78 def def_finder(method_prefix, column_names, scope_operation = '') arg_names = column_names.join(', ') method_suffix = finder_method_suffix(column_names) column_filter_expr = column_names .map { |name| "#{name}: #{name}" }.join(', ') singleton_class.module_eval(<<-RUBY, __FILE__, __LINE__+1) def #{method_prefix}_#{method_suffix}(#{arg_names}) where(#{column_filter_expr})#{scope_operation} end RUBY end
def_key_finders(method_prefix, scope_operation = '')
click to toggle source
# File lib/cequel/record/finders.rb, line 73 def def_key_finders(method_prefix, scope_operation = '') def_finder(method_prefix, key_column_names, scope_operation) def_finder(method_prefix, key_column_names.last(1), scope_operation) end
finder_method_suffix(column_names)
click to toggle source
# File lib/cequel/record/finders.rb, line 97 def finder_method_suffix(column_names) column_names.join('_and_') end
key(*)
click to toggle source
Calls superclass method
# File lib/cequel/record/finders.rb, line 54 def key(*) if key_columns.any? def_key_finders('find_all_by', '.entries') undef_key_finders('find_by') end super def_key_finders('find_by', '.first') def_key_finders('with') end
undef_key_finders(method_prefix)
click to toggle source
# File lib/cequel/record/finders.rb, line 91 def undef_key_finders(method_prefix) method_suffix = finder_method_suffix(key_column_names) method_name = "#{method_prefix}_#{method_suffix}" singleton_class.module_eval { undef_method(method_name) } end