Class: OAI::Provider::ActiveRecordWrapper
- Defined in:
- lib/oai/provider/model/activerecord_wrapper.rb
Overview
This class wraps an ActiveRecord model and delegates all of the record selection/retrieval to the AR model. It accepts options for specifying the update timestamp field, a timeout, and a limit. The limit option is used for doing pagination with resumption tokens. The expiration timeout is ignored, since all necessary information is encoded in the token.
Direct Known Subclasses
Instance Attribute Summary collapse
-
#identifier_field ⇒ Object
readonly
Returns the value of attribute identifier_field.
-
#model ⇒ Object
readonly
Returns the value of attribute model.
-
#timestamp_field ⇒ Object
readonly
Returns the value of attribute timestamp_field.
Instance Method Summary collapse
- #deleted?(record) ⇒ Boolean
- #earliest ⇒ Object
- #find(selector, options = {}) ⇒ Object
-
#initialize(model, options = {}) ⇒ ActiveRecordWrapper
constructor
If custom ‘timestamp_field’ is used, be aware this will be an ActiveRecord attribute that we will limit on, so perhaps should be indexe appropriately.
- #latest ⇒ Object
- #method_missing(m, *args, &block) ⇒ Object
- #respond_to?(m, *args) ⇒ Boolean
-
#sets ⇒ Object
A model class is expected to provide a method Model.sets that returns all the sets the model supports.
Methods inherited from Model
Constructor Details
#initialize(model, options = {}) ⇒ ActiveRecordWrapper
If custom ‘timestamp_field’ is used, be aware this will be an ActiveRecord attribute that we will limit on, so perhaps should be indexe appropriately.
If custom ‘identifier_field` is used, be aware this will be an ActiveRecord attribute that we will sort on, and use in WHERE clauses with `=` as well as greater than/less than, so should be indexed appropriately.
21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/oai/provider/model/activerecord_wrapper.rb', line 21 def initialize(model, ={}) @model = model @timestamp_field = .delete(:timestamp_field) || 'updated_at' @identifier_field = .delete(:identifier_field) || model.primary_key || "id" @limit = .delete(:limit) || 100 unless .empty? raise ArgumentError.new( "Unsupported options [#{.keys.join(', ')}]" ) end end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(m, *args, &block) ⇒ Object
85 86 87 88 89 90 91 |
# File 'lib/oai/provider/model/activerecord_wrapper.rb', line 85 def method_missing(m, *args, &block) if m =~ /^map_/ model.send(m, *args, &block) else super end end |
Instance Attribute Details
#identifier_field ⇒ Object (readonly)
Returns the value of attribute identifier_field.
13 14 15 |
# File 'lib/oai/provider/model/activerecord_wrapper.rb', line 13 def identifier_field @identifier_field end |
#model ⇒ Object (readonly)
Returns the value of attribute model.
13 14 15 |
# File 'lib/oai/provider/model/activerecord_wrapper.rb', line 13 def model @model end |
#timestamp_field ⇒ Object (readonly)
Returns the value of attribute timestamp_field.
13 14 15 |
# File 'lib/oai/provider/model/activerecord_wrapper.rb', line 13 def @timestamp_field end |
Instance Method Details
#deleted?(record) ⇒ Boolean
68 69 70 71 72 73 74 75 |
# File 'lib/oai/provider/model/activerecord_wrapper.rb', line 68 def deleted?(record) if record.respond_to?(:deleted_at) return record.deleted_at elsif record.respond_to?(:deleted) return record.deleted end false end |
#earliest ⇒ Object
34 35 36 37 |
# File 'lib/oai/provider/model/activerecord_wrapper.rb', line 34 def earliest earliest_obj = model.order("#{} asc").first earliest_obj.nil? ? Time.at(0) : earliest_obj.send() end |
#find(selector, options = {}) ⇒ Object
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/oai/provider/model/activerecord_wrapper.rb', line 50 def find(selector, ={}) find_scope = find_scope() return next_set(find_scope, [:resumption_token]) if [:resumption_token] conditions = sql_conditions() if :all == selector total = find_scope.where(conditions).count if @limit && total > @limit select_partial(find_scope, ResumptionToken.new(.merge({:last => 0}))) else find_scope.where(conditions) end else find_scope.where(conditions).find_by!(identifier_field => selector) end end |
#latest ⇒ Object
39 40 41 42 |
# File 'lib/oai/provider/model/activerecord_wrapper.rb', line 39 def latest latest_obj = model.order("#{} desc").first latest_obj.nil? ? Time.now : latest_obj.send() end |
#respond_to?(m, *args) ⇒ Boolean
77 78 79 80 81 82 83 |
# File 'lib/oai/provider/model/activerecord_wrapper.rb', line 77 def respond_to?(m, *args) if m =~ /^map_/ model.respond_to?(m, *args) else super end end |
#sets ⇒ Object
A model class is expected to provide a method Model.sets that returns all the sets the model supports. See the activerecord_provider tests for an example.
46 47 48 |
# File 'lib/oai/provider/model/activerecord_wrapper.rb', line 46 def sets model.sets if model.respond_to?(:sets) end |