# File lib/puppet/rails/host.rb, line 46
46:   def merge_facts(facts)
47:     db_facts = {}
48: 
49:     deletions = []
50:     self.fact_values.find(:all, :include => :fact_name).each do |value|
51:       deletions << value['id'] and next unless facts.include?(value['name'])
52:       # Now store them for later testing.
53:       db_facts[value['name']] ||= []
54:       db_facts[value['name']] << value
55:     end
56: 
57:     # Now get rid of any parameters whose value list is different.
58:     # This might be extra work in cases where an array has added or lost
59:     # a single value, but in the most common case (a single value has changed)
60:     # this makes sense.
61:     db_facts.each do |name, value_hashes|
62:       values = value_hashes.collect { |v| v['value'] }
63: 
64:       unless values == facts[name]
65:         value_hashes.each { |v| deletions << v['id'] }
66:       end
67:     end
68: 
69:     # Perform our deletions.
70:     Puppet::Rails::FactValue.delete(deletions) unless deletions.empty?
71: 
72:     # Lastly, add any new parameters.
73:     facts.each do |name, value|
74:       next if db_facts.include?(name)
75:       values = value.is_a?(Array) ? value : [value]
76: 
77:       values.each do |v|
78:         fact_values.build(:value => v, :fact_name => Puppet::Rails::FactName.find_or_create_by_name(name))
79:       end
80:     end
81:   end