module MongoidFixtures
Constants
- VERSION
Public Class Methods
create_or_save_instance(instance)
click to toggle source
# File lib/mongoid_fixtures.rb, line 151 def self.create_or_save_instance(instance) attributes = instance.attributes.select { |key, value| !key.to_s.eql?('_id') } flattened_attributes = flatten_attributes(attributes) if instance.class.where(flattened_attributes).exists? instance = instance.class.where(flattened_attributes).first else EmbedUtils.insert_embedded_ids(instance) instance.save! # auto serialize the document end instance end
flatten_attributes(attributes)
click to toggle source
# File lib/mongoid_fixtures.rb, line 116 def self.flatten_attributes(attributes) flattened_attributes = {} if attributes.is_a? String return attributes end if attributes.is_a? Mongoid::Document attributes.attributes.each do |name, attribute| unless name.eql? '_id' flattened_attributes["#{attributes.class.to_s.downcase}.#{name}"] = attribute end end else attributes.each do |key, values| if values.is_a? Hash values.each do |value, inner_value| flattened_attributes["#{key}.#{value}"] = inner_value end elsif values.is_a? Mongoid::Document values.attributes.each do |name, attribute| unless name.eql? '_id' flattened_attributes["#{values.class.to_s.downcase}.#{name}"] = values.send(name) end end elsif values.is_a? Array # Don't do anything else flattened_attributes[key] = values end end end flattened_attributes end
include_setter?(instance, setter)
click to toggle source
# File lib/mongoid_fixtures.rb, line 112 def self.include_setter?(instance, setter) instance.class.instance_methods.include? "#{setter}=".to_sym end
load(clazz)
click to toggle source
# File lib/mongoid_fixtures.rb, line 52 def self.load(clazz) fixture_instances = Loader.instance.fixtures[clazz.to_s.downcase.en.plural] # get class name instances = {} if fixture_instances.nil? raise "Could not find instances for #{clazz}" end fixture_instances.each do |key, fixture_instance| instance = clazz.new fields = fixture_instance.keys fields.each do |field| value = fixture_instance[field] field_label = field.to_s.capitalize field_clazz = Module.resolve_class_ignore_plurality(field_label) # If the current value is a symbol then it represents another fixture. # Find it and store its id if value.is_a? Symbol or value.nil? relations = instance.relations if relations.include? field if relations[field].relation.eql? Mongoid::Relations::Referenced::In or relations[field].relation.eql? Mongoid::Relations::Referenced::One instance.send("#{field}=", self.load(field_clazz)[value]) else # instance[field] = self.load(field_clazz)[value].id # embedded fields? raise "#{instance} relationship not defined: #{relations[field].relation}" end else raise "Symbol (#{value.nil? ? value : 'nil'}) doesn't reference relationship" end elsif value.is_a? Array values = [] value.each do |v| if field_clazz.nil? values << v else values << EmbedUtils.create_embedded_instance(field_clazz, v, instance) end end if instance[field].nil? instance[field] = [] end instance[field].concat(values) elsif value.is_a? Hash # take hash convert it to object and serialize it instance[field] = EmbedUtils.create_embedded_instance(field_clazz, value, instance) # else just set the field else if include_setter?(instance, field) instance.send("#{field}=", value) else instance[field] = value end end end instances[key] = create_or_save_instance(instance) # store it based on its key name end instances end