- node_ids = segments.collect {|segment| segment.node_a }
- node_ids += segments.collect {|segment| segment.node_b }
- node_ids += [-1]
- nodes = Node.find(:all, :conditions => "visible = 1 AND id IN (#{node_ids.join(',')})")
-
- # Render
+ # first collect nodes, ways, and relations referenced by this relation.
+
+ ways = Way.find_by_sql("select w.* from current_ways w,current_relation_members rm where "+
+ "rm.member_type='way' and rm.member_id=w.id and rm.id=#{relation.id}");
+ nodes = Node.find_by_sql("select n.* from current_nodes n,current_relation_members rm where "+
+ "rm.member_type='node' and rm.member_id=n.id and rm.id=#{relation.id}");
+ # note query is built to exclude self just in case.
+ relations = Relation.find_by_sql("select r.* from current_relations r,current_relation_members rm where "+
+ "rm.member_type='relation' and rm.member_id=r.id and rm.id=#{relation.id} and r.id<>rm.id");
+
+ # now additionally collect nodes referenced by ways. Note how we recursively
+ # evaluate ways but NOT relations.
+
+ node_ids = nodes.collect {|node| node.id }
+ way_node_ids = ways.collect { |way|
+ way.way_nodes.collect { |way_node| way_node.node_id }
+ }
+ way_node_ids.flatten!
+ way_node_ids.uniq
+ way_node_ids -= node_ids
+ nodes += Node.find(way_node_ids)
+
+ # create XML.