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:
116: db_facts[value['name']] ||= []
117: db_facts[value['name']] << value
118: end
119:
120:
121:
122:
123:
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:
133: Puppet::Rails::FactValue.delete(deletions) unless deletions.empty?
134:
135:
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