class Relation < ActiveRecord::Base
require 'xml/libxml'
+ set_table_name 'current_relations'
+
belongs_to :user
+ has_many :old_relations, :foreign_key => 'id', :order => 'version'
+
has_many :relation_members, :foreign_key => 'id'
has_many :relation_tags, :foreign_key => 'id'
- has_many :old_relations, :foreign_key => 'id', :order => 'version'
-
- set_table_name 'current_relations'
+ has_many :containing_relation_members, :class_name => "RelationMember", :as => :member
+ has_many :containing_relations, :class_name => "Relation", :through => :containing_relation_members, :source => :relation, :extend => ObjectFinder
def self.from_xml(xml, create=false)
begin
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(',')})")
+ def self.find_for_nodes(ids, options = {})
+ if ids.empty?
+ return []
+ else
+ self.with_scope(:find => { :joins => "INNER JOIN current_relation_members ON current_relation_members.id = current_relations.id", :conditions => "current_relation_members.member_type = 'node' AND current_relation_members.member_id IN (#{ids.join(',')})" }) do
+ return self.find(:all, options)
+ end
end
+ end
- relations # if you don't do this then it returns nil and not []
+ def self.find_for_ways(ids, options = {})
+ if ids.empty?
+ return []
+ else
+ self.with_scope(:find => { :joins => "INNER JOIN current_relation_members ON current_relation_members.id = current_relations.id", :conditions => "current_relation_members.member_type = 'way' AND current_relation_members.member_id IN (#{ids.join(',')})" }) do
+ return self.find(:all, options)
+ end
+ end
end
+ def self.find_for_relations(ids, options = {})
+ if ids.empty?
+ return []
+ else
+ self.with_scope(:find => { :joins => "INNER JOIN current_relation_members ON current_relation_members.id = current_relations.id", :conditions => "current_relation_members.member_type = 'relation' AND current_relation_members.member_id IN (#{ids.join(',')})" }) do
+ return self.find(:all, options)
+ end
+ end
+ end
# FIXME is this really needed?
def members
return false
end
+ # Temporary method to match interface to nodes
+ def tags_as_hash
+ return self.tags
+ end
end