lib/seed-fu.rb in jcnetdev-seed-fu-1.0.200807042 vs lib/seed-fu.rb in jcnetdev-seed-fu-1.1

- old
+ new

@@ -1,64 +1,73 @@ module SeedFu class Seeder def self.plant(model_class, *constraints, &block) constraints = [:id] if constraints.empty? seed = Seeder.new(model_class) + + options = constraints.last if (constraints.last.is_a? Hash) + constraints.delete_at(*constraints.length-1) if (constraints.last.is_a? Hash) + + insert_only = constraints.last.is_a? TrueClass + constraints.delete_at(*constraints.length-1) if (constraints.last.is_a? TrueClass or constraints.last.is_a? FalseClass) seed.set_constraints(*constraints) yield seed - seed.plant! + seed.plant!({:insert_only => insert_only}.merge(options||{})) end - + def initialize(model_class) @model_class = model_class @constraints = [:id] @data = {} end - + def set_constraints(*constraints) raise "You must set at least one constraint." if constraints.empty? @constraints = [] constraints.each do |constraint| raise "Your constraint `#{constraint}` is not a column in #{@model_class}. Valid columns are `#{@model_class.column_names.join("`, `")}`." unless @model_class.column_names.include?(constraint.to_s) @constraints << constraint.to_sym end end - + def set_attribute(name, value) @data[name.to_sym] = value end - - def plant! + + def plant!(options) + insert_only = options[:insert_only].nil? ? false : options[:insert_only] + enable_validation = options[:validate].nil? ? true : options[:validate] record = get + return if !record.new_record? and insert_only @data.each do |k, v| record.send("#{k}=", v) end - record.save! - puts " - #{@model_class} #{condition_hash.inspect}" + record.save(enable_validation) || raise(RecordNotSaved) + puts " - #{@model_class} #{condition_hash.inspect}" record end - + def method_missing(method_name, *args) #:nodoc: if (match = method_name.to_s.match(/(.*)=$/)) && args.size == 1 set_attribute(match[1], args.first) else super end end - + protected - + def get records = @model_class.find(:all, :conditions => condition_hash) raise "Given constraints yielded multiple records." unless records.size < 2 if records.any? return records.first else return @model_class.new end end - + def condition_hash @data.reject{|a,v| !@constraints.include?(a)} end end end @@ -70,7 +79,18 @@ # # === Parameters # constraints :: Immutable reference attributes. Defaults to :id def self.seed(*constraints, &block) SeedFu::Seeder.plant(self, *constraints, &block) + end + + def self.seed_many(*constraints) + seeds = constraints.pop + seeds.each do |seed_data| + seed(*constraints) do |s| + seed_data.each_pair do |k,v| + s.send "#{k}=", v + end + end + end end end \ No newline at end of file