X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/78b440ffc1e0448f8a6d73c8821dd58634ffb475..4fbc1ddde4d33dd0bf13f7a035f7faa96f3ef1e7:/app/models/relation.rb diff --git a/app/models/relation.rb b/app/models/relation.rb index f74a149ec..61344bdfb 100644 --- a/app/models/relation.rb +++ b/app/models/relation.rb @@ -102,23 +102,46 @@ class Relation < ActiveRecord::Base return el1 end + + # collect relationships. currently done in one big block at the end; + # may need to move this upwards if people want automatic completion of + # relationships, i.e. deliver referenced objects like we do with ways... + # FIXME: rip out the fucking SQL + def self.find_for_nodes_and_ways(node_ids, way_ids) + relations = [] + + if node_ids.length > 0 + relations += Relation.find_by_sql("select e.* from current_relations e,current_relation_members em where " + + "e.visible=1 and " + + "em.id = e.id and em.member_type='node' and em.member_id in (#{node_ids.join(',')})") + end + if way_ids.length > 0 + relations += Relation.find_by_sql("select e.* from current_relations e,current_relation_members em where " + + "e.visible=1 and " + + "em.id = e.id and em.member_type='way' and em.member_id in (#{way_ids.join(',')})") + end + + relations # if you don't do this then it returns nil and not [] + end + + # FIXME is this really needed? def members unless @members - @members = Array.new - self.relation_members.each do |member| - @members += [[member.member_type,member.member_id,member.member_role]] - end + @members = Array.new + self.relation_members.each do |member| + @members += [[member.member_type,member.member_id,member.member_role]] + end end @members end def tags unless @tags - @tags = Hash.new - self.relation_tags.each do |tag| - @tags[tag.k] = tag.v - end + @tags = Hash.new + self.relation_tags.each do |tag| + @tags[tag.k] = tag.v + end end @tags end @@ -141,46 +164,40 @@ class Relation < ActiveRecord::Base @tags[k] = v end - def save_with_history - begin - Relation.transaction do - t = Time.now - self.timestamp = t - self.save! - - tags = self.tags + def save_with_history! + Relation.transaction do + t = Time.now + self.timestamp = t + self.save! - RelationTag.delete_all(['id = ?', self.id]) + tags = self.tags - tags.each do |k,v| - tag = RelationTag.new - tag.k = k - tag.v = v - tag.id = self.id - tag.save! - end + RelationTag.delete_all(['id = ?', self.id]) - members = self.members + tags.each do |k,v| + tag = RelationTag.new + tag.k = k + tag.v = v + tag.id = self.id + tag.save! + end - RelationMember.delete_all(['id = ?', self.id]) + members = self.members - members.each do |n| - mem = RelationMember.new - mem.id = self.id - mem.member_type = n[0]; - mem.member_id = n[1]; - mem.member_role = n[2]; - mem.save! - end + RelationMember.delete_all(['id = ?', self.id]) - old_relation = OldRelation.from_relation(self) - old_relation.timestamp = t - old_relation.save_with_dependencies! + members.each do |n| + mem = RelationMember.new + mem.id = self.id + mem.member_type = n[0]; + mem.member_id = n[1]; + mem.member_role = n[2]; + mem.save! end - return true - rescue Exception => ex - return nil + old_relation = OldRelation.from_relation(self) + old_relation.timestamp = t + old_relation.save_with_dependencies! end end