module ActiveRecord::ClassMethods

Constants

SERVER_METHODS

ignore any of these methods if they get called on the client. This list should be trimmed down to include only methods to be called as “macros” such as :after_create, etc…

Public Instance Methods

_react_param_conversion(param, opt = nil) click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 248
def _react_param_conversion(param, opt = nil)
  param = Native(param)
  param = JSON.from_object(param.to_n) if param.is_a? Native::Object
  result = if param.is_a? self
    param
  elsif param.is_a? Hash
    if opt == :validate_only
      klass = ReactiveRecord::Base.infer_type_from_hash(self, param)
      klass == self or klass < self
    else
      if param[primary_key]
        target = find(param[primary_key])
      else
        target = new
      end
      associations = reflect_on_all_associations
      param = param.collect do |key, value|
        assoc = reflect_on_all_associations.detect do |assoc|
          assoc.association_foreign_key == key
        end
        if assoc
          if value
            [assoc.attribute, {id: [value], type: [nil]}]
          else
            [assoc.attribute, [nil]]
          end
        else
          [key, [value]]
        end
      end

      # We do want to be doing something like this, but this breaks other stuff...
      #
      # ReactiveRecord::Base.load_data do
      #   ReactiveRecord::ServerDataCache.load_from_json(Hash[param], target)
      # end

      ReactiveRecord::ServerDataCache.load_from_json(Hash[param], target)
      target
    end
  else
    nil
  end
  result
end
abstract_class=(val) click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 149
def abstract_class=(val)
  @abstract_class = val
end
abstract_class?() click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 19
def abstract_class?
  defined?(@abstract_class) && @abstract_class == true
end
all() click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 163
def all
  ReactiveRecord::Base.class_scopes(self)[:all] ||= ReactiveRecord::Collection.new(self, nil, nil, self, "all")
end
all=(collection) click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 167
def all=(collection)
  ReactiveRecord::Base.class_scopes(self)[:all] = collection
end
base_class() click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 5
def base_class

  unless self < Base
    raise ActiveRecordError, "#{name} doesn't belong in a hierarchy descending from ActiveRecord"
  end

  if superclass == Base || superclass.abstract_class?
    self
  else
    superclass.base_class
  end

end
column_names() click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 212
def column_names
  ReactiveRecord::Base.public_columns_hash.keys
end
columns_hash() click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 216
def columns_hash
  ReactiveRecord::Base.public_columns_hash[name] || {}
end
composed_of(name, opts = {}) click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 204
def composed_of(name, opts = {})
  Aggregations::AggregationReflection.new(base_class, :composed_of, name, opts)
  define_method(name) { @backing_record.reactive_get!(name, nil) }
  define_method("#{name}=") do |val|
    @backing_record.reactive_set!(name, backing_record.convert(name, val))
  end
end
define_attribute_methods() click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 236
def define_attribute_methods
  columns_hash.keys.each do |name|
    next if name == :id
    define_method(name) { @backing_record.reactive_get!(name, nil) }
    define_method("#{name}!") { @backing_record.reactive_get!(name, true) }
    define_method("#{name}=") do |val|
      @backing_record.reactive_set!(name, backing_record.convert(name, val))
    end
    define_method("#{name}_changed?") { @backing_record.changed?(name) }
  end
end
enum(*args) click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 52
def enum(*args)
  # when we implement schema validation we should also implement value checking
end
find(id) click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 44
def find(id)
  base_class.instance_eval {ReactiveRecord::Base.find(self, primary_key, id)}
end
find_by(opts = {}) click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 48
def find_by(opts = {})
  base_class.instance_eval {ReactiveRecord::Base.find(self, opts.first.first, opts.first.last)}
end
inheritance_column() click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 31
def inheritance_column
  base_class.instance_eval {@inheritance_column_value || "type"}
end
inheritance_column=(name) click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 35
def inheritance_column=(name)
  base_class.instance_eval {@inheritance_column_value = name}
end
method_missing(name, *args, &block) click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 141
def method_missing(name, *args, &block)
  if args.count == 1 && name =~ /^find_by_/ && !block
    find_by(name.gsub(/^find_by_/, "") => args[0])
  elsif !SERVER_METHODS.include?(name)
    raise "#{self.name}.#{name}(#{args}) (called class method missing)"
  end
end
model_name() click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 39
def model_name
  # in reality should return ActiveModel::Name object, blah blah
  name
end
primary_key() click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 23
def primary_key
  base_class.instance_eval { @primary_key_value || :id }
end
primary_key=(val) click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 27
def primary_key=(val)
 base_class.instance_eval {  @primary_key_value = val }
end
scope(name, body) click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 153
def scope(name, body)
  singleton_class.send(:define_method, name) do | *args |
    args = (args.count == 0) ? name : [name, *args]
    ReactiveRecord::Base.class_scopes(self)[args] ||= ReactiveRecord::Collection.new(self, nil, nil, self, args)
  end
  singleton_class.send(:define_method, "#{name}=") do |collection|
    ReactiveRecord::Base.class_scopes(self)[name] = collection
  end
end
server_method(name, default: nil) click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 224
def server_method(name, default: nil)
  server_methods[name] = { default: default }
  define_method(name) do |*args|
    vector = args.count.zero? ? name : [[name]+args]
    @backing_record.reactive_get!(vector, nil)
  end
  define_method("#{name}!") do |*args|
    vector = args.count.zero? ? name : [[name]+args]
    @backing_record.reactive_get!(vector, true)
  end
end
server_methods() click to toggle source
# File lib/reactive_record/active_record/class_methods.rb, line 220
def server_methods
  @server_methods ||= {}
end