class RailsConnector::Meta::EagerLoader
Attributes
obj_classes[R]
Public Class Methods
new()
click to toggle source
# File lib/rails_connector/meta/eager_loader.rb, line 10 def initialize # Rails.logger.debug "EagerLoader: I am eager to start working" @obj_classes = {} # Rails 3.1 contains a bug that screws attribute loading # attributes are set to assigned classes if ::Rails::VERSION::MAJOR == 3 && ::Rails::VERSION::MINOR == 1 RailsConnector::ObjClass.all.each do |obj_class| obj_class.custom_attributes @obj_classes[obj_class.name] = obj_class end else RailsConnector::ObjClass.includes(:custom_attributes_raw).all.each do |obj_class| @obj_classes[obj_class.name] = obj_class end preload_attribute_blobs end end
Public Instance Methods
forget_obj_class(name)
click to toggle source
# File lib/rails_connector/meta/eager_loader.rb, line 38 def forget_obj_class(name) @obj_classes.delete(name.to_s) end
obj_class(name)
click to toggle source
# File lib/rails_connector/meta/eager_loader.rb, line 28 def obj_class(name) name = name.to_s if !@obj_classes.fetch(name, nil).nil? @obj_classes[name] else # TODO: preload_attribute_blobs for obj_class @obj_classes[name] ||= RailsConnector::ObjClass.find_by_obj_class_name(name) end end
Protected Instance Methods
preload_attribute_blobs()
click to toggle source
# File lib/rails_connector/meta/eager_loader.rb, line 43 def preload_attribute_blobs attribute_names = Set.new @obj_classes.each do |_, obj_class| obj_class.custom_attributes.each do |attribute_name, _| attribute_names << attribute_name end end blob_names = attribute_names.map {|attribute_name| "#{attribute_name}.jsonAttributeDict" } # Fiona >= 6.8 if RailsConnector::BlobMapping.exists? blob_names = attribute_names.map {|attribute_name| "#{attribute_name}.jsonAttributeDict" } fingerprint_map = RailsConnector::BlobMapping.get_fingerprint_map(blob_names) blob_fingerprints = fingerprint_map.values # NOTE: this is correct! blobs = RailsConnector::Blob.where(:blob_name => blob_fingerprints).to_a blob_map = Hash[blobs.map {|b| [b.blob_name, b]}] @obj_classes.each do |_, obj_class| obj_class.custom_attributes.each do |_, attribute| blob_name = "#{attribute.name}.jsonAttributeDict" fingerprint = fingerprint_map[blob_name] blob = blob_map[fingerprint] next unless blob && blob.blob_data? attribute.instance_variable_set(:@blob_data, ::JSON.parse(blob.blob_data)) end end # Fiona = 6.7 else blob_names = attribute_names.map {|attribute_name| "#{attribute_name}.jsonAttributeDict" } blobs = RailsConnector::Blob.where(:blob_name => blob_names).to_a blob_map = Hash[blobs.map {|b| [b.blob_name, b]}] @obj_classes.each do |_, obj_class| obj_class.custom_attributes.each do |_, attribute| blob_name = "#{attribute.name}.jsonAttributeDict" blob = blob_map[blob_name] next unless blob && blob.blob_data? attribute.instance_variable_set(:@blob_data, ::JSON.parse(blob.blob_data)) end end end end