class SampleModels::Creation
Public Class Methods
new(sampler, *args)
click to toggle source
# File lib/sample_models/creation.rb, line 5 def initialize(sampler, *args) @sampler = sampler @specified_attrs = SpecifiedAttributes.new(sampler, *args).result end
Public Instance Methods
belongs_to_assoc(column_name)
click to toggle source
# File lib/sample_models/creation.rb, line 10 def belongs_to_assoc(column_name) model.belongs_to_associations.detect { |assoc| assoc.foreign_key == column_name || assoc.foreign_type == column_name } end
deferred_belongs_to_assocs()
click to toggle source
# File lib/sample_models/creation.rb, line 17 def deferred_belongs_to_assocs @deferred_belongs_to_assocs ||= begin model.belongs_to_associations.select { |a| @instance.send(a.foreign_key).nil? && !@specified_attrs.member?(a.foreign_key) && !@specified_attrs.member?(a.name) && !@sampler.defaults.member?(a.foreign_key) && !@sampler.defaults.member?(a.name) } end end
model()
click to toggle source
# File lib/sample_models/creation.rb, line 29 def model @sampler.model end
run()
click to toggle source
# File lib/sample_models/creation.rb, line 33 def run attrs = @specified_attrs.clone @sampler.defaults.each do |attr, val| unless attrs.member?(attr) || ((assoc = model.belongs_to_association(attr)) && (attrs.member?(assoc.name) || attrs.member?(assoc.foreign_key))) attrs[attr] = val end end columns_to_fill = model.columns.clone.reject { |c| c.name == 'id' || timestamp?(c.name) } model.validated_attr_accessors.each do |attr| columns_to_fill << VirtualColumn.new(attr) end columns_to_fill.each do |column| unless attrs.member?(column.name) || specified_association_value?(column.name) || ((assoc = belongs_to_assoc(column.name)) && attrs.member?(assoc.name)) sequence = @sampler.first_pass_attribute_sequence(column) attrs[column.name] = sequence.value end end @instance = model.new attrs.each do |k, v| @instance.send("#{k}=", v) end save! update_with_deferred_associations! @instance end
save!()
click to toggle source
# File lib/sample_models/creation.rb, line 65 def save! if @sampler.before_save if @sampler.before_save.arity == 1 @sampler.before_save.call(@instance) else @sampler.before_save.call(@instance, @specified_attrs) end end @instance.save! end
specified_association_value?(column_name)
click to toggle source
# File lib/sample_models/creation.rb, line 76 def specified_association_value?(column_name) @specified_attrs.any? { |attr, val| if assoc = model.belongs_to_association(attr) assoc.foreign_key == column_name end } end
timestamp?(column_name)
click to toggle source
# File lib/sample_models/creation.rb, line 84 def timestamp?(column_name) %w(created_at updated_at created_on updated_on).include?(column_name) end
update_with_deferred_associations!()
click to toggle source
# File lib/sample_models/creation.rb, line 88 def update_with_deferred_associations! unless deferred_belongs_to_assocs.empty? deferred_belongs_to_assocs.each do |a| if a.polymorphic? klass = @sampler.polymorphic_default_classes[a.name] klass ||= SampleModels.samplers.values.map(&:model).detect { |m| m != @sampler.model } @instance.send("#{a.name}=", klass.sample) else column = model.columns.detect { |c| c.name == a.foreign_key } @instance.send( "#{a.foreign_key}=", @sampler.second_pass_attribute_sequence(column).next ) end end save! end end