# File lib/puppet/rails/host.rb, line 109
109:     def merge_facts(facts)
110:         db_facts = {}
111: 
112:         deletions = []
113:         self.fact_values.find(:all, :include => :fact_name).each do |value|
114:             deletions << value['id'] and next unless facts.include?(value['name'])
115:             # Now store them for later testing.
116:             db_facts[value['name']] ||= []
117:             db_facts[value['name']] << value
118:         end
119: 
120:         # Now get rid of any parameters whose value list is different.
121:         # This might be extra work in cases where an array has added or lost
122:         # a single value, but in the most common case (a single value has changed)
123:         # this makes sense.
124:         db_facts.each do |name, value_hashes|
125:             values = value_hashes.collect { |v| v['value'] }
126: 
127:             unless values == facts[name]
128:                 value_hashes.each { |v| deletions << v['id'] }
129:             end
130:         end
131: 
132:         # Perform our deletions.
133:         Puppet::Rails::FactValue.delete(deletions) unless deletions.empty?
134: 
135:         # Lastly, add any new parameters.
136:         facts.each do |name, value|
137:             next if db_facts.include?(name)
138:             values = value.is_a?(Array) ? value : [value]
139: 
140:             values.each do |v|
141:                 fact_values.build(:value => v, :fact_name => Puppet::Rails::FactName.find_or_create_by_name(name))
142:             end
143:         end
144:     end