Railsify the relation member model, type attribute, by putting it into class case, rather than lower case. Requires reload of postgres databases or manual change to the enum. Fixes the databrowser on postgres, however affects the rest of the codebase.

This commit is contained in:
Shaun McDonald 2009-04-15 14:49:21 +00:00
parent 5bc558e355
commit 08bd1688ee
9 changed files with 37 additions and 36 deletions

View file

@ -133,7 +133,7 @@ class Node < ActiveRecord::Base
check_consistency(self, new_node, user)
if WayNode.find(:first, :joins => "INNER JOIN current_ways ON current_ways.id = current_way_nodes.id", :conditions => [ "current_ways.visible = ? AND current_way_nodes.node_id = ?", true, self.id ])
raise OSM::APIPreconditionFailedError.new
elsif RelationMember.find(:first, :joins => "INNER JOIN current_relations ON current_relations.id=current_relation_members.id", :conditions => [ "visible = ? AND member_type='node' and member_id=? ", true, self.id])
elsif RelationMember.find(:first, :joins => "INNER JOIN current_relations ON current_relations.id=current_relation_members.id", :conditions => [ "visible = ? AND member_type='Node' and member_id=? ", true, self.id])
raise OSM::APIPreconditionFailedError.new
else
self.changeset_id = new_node.changeset_id

View file

@ -41,7 +41,7 @@ class OldRelation < ActiveRecord::Base
self.members.each_with_index do |m,i|
member = OldRelationMember.new
member.id = [self.id, self.version, i]
member.member_type = m[0]
member.member_type = m[0].classify
member.member_id = m[1]
member.member_role = m[2]
member.save!
@ -108,7 +108,7 @@ class OldRelation < ActiveRecord::Base
self.old_members.each do |member|
e = XML::Node.new 'member'
e['type'] = member.member_type.to_s
e['type'] = member.member_type.to_s.downcase
e['ref'] = member.member_id.to_s # "id" is considered uncool here as it should be unique in XML
e['role'] = member.member_role.to_s
el1 << e

View file

@ -74,7 +74,7 @@ class Relation < ActiveRecord::Base
#member_role
member['role'] ||= "" # Allow the upload to not include this, in which case we default to an empty string.
logger.debug member['role']
relation.add_member(member['type'], member['ref'], member['role'])
relation.add_member(member['type'].classify, member['ref'], member['role'])
end
raise OSM::APIBadUserInput.new("Some bad xml in relation") if relation.nil?
@ -125,7 +125,7 @@ class Relation < ActiveRecord::Base
#end
if p
e = XML::Node.new 'member'
e['type'] = member.member_type
e['type'] = member.member_type.downcase
e['ref'] = member.member_id.to_s
e['role'] = member.member_role
el1 << e
@ -145,7 +145,7 @@ class Relation < ActiveRecord::Base
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
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
@ -155,7 +155,7 @@ class Relation < ActiveRecord::Base
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
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
@ -165,7 +165,7 @@ class Relation < ActiveRecord::Base
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
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
@ -236,7 +236,7 @@ class Relation < ActiveRecord::Base
Relation.transaction do
check_consistency(self, new_relation, user)
# This will check to see if this relation is used by another relation
if RelationMember.find(:first, :joins => "INNER JOIN current_relations ON current_relations.id=current_relation_members.id", :conditions => [ "visible = ? AND member_type='relation' and member_id=? ", true, self.id ])
if RelationMember.find(:first, :joins => "INNER JOIN current_relations ON current_relations.id=current_relation_members.id", :conditions => [ "visible = ? AND member_type='Relation' and member_id=? ", true, self.id ])
raise OSM::APIPreconditionFailedError.new("The relation #{new_relation.id} is a used in another relation")
end
self.changeset_id = new_relation.changeset_id
@ -281,13 +281,12 @@ class Relation < ActiveRecord::Base
elements = { :node => Hash.new, :way => Hash.new, :relation => Hash.new }
self.members.each do |m|
# find the hash for the element type or die
hash = elements[m[0].to_sym] or return false
logger.debug m[0]
hash = elements[m[0].downcase.to_sym] or return false
# unless its in the cache already
unless hash.key? m[1]
# use reflection to look up the appropriate class
model = Kernel.const_get(m[0].capitalize)
# get the element with that ID
element = model.find(m[1])
@ -317,7 +316,7 @@ class Relation < ActiveRecord::Base
self.members.map! do |type, id, role|
old_id = id.to_i
if old_id < 0
new_id = id_map[type.to_sym][old_id]
new_id = id_map[type.downcase.to_sym][old_id]
raise "invalid placeholder" if new_id.nil?
[type, new_id, role]
else
@ -435,14 +434,16 @@ class Relation < ActiveRecord::Base
# FIXME: check for tag changes along with element deletions and
# make sure that the deleted element's bounding box is hit.
self.members.each do |type, id, role|
if type != "relation"
if type != "Relation"
update_changeset_element(type, id)
end
end
else
# add only changed members to the changeset
changed_members.each do |id, type|
update_changeset_element(type, id)
if type != "Relation"
update_changeset_element(type, id)
end
end
end

View file

@ -6,15 +6,15 @@ class RelationMember < ActiveRecord::Base
belongs_to :relation, :foreign_key => :id
def after_find
self[:member_class] = self.member_type.capitalize
self[:member_class] = self.member_type.classify
end
def after_initialize
self[:member_class] = self.member_type.capitalize unless self.member_type.nil?
self[:member_class] = self.member_type.classify unless self.member_type.nil?
end
def before_save
self.member_type = self[:member_class].downcase
self.member_type = self[:member_class].classify
end
def member_type=(type)

View file

@ -246,7 +246,7 @@ class Way < ActiveRecord::Base
Way.transaction do
check_consistency(self, new_way, user)
if RelationMember.find(:first, :joins => "INNER JOIN current_relations ON current_relations.id=current_relation_members.id",
:conditions => [ "visible = ? AND member_type='way' and member_id=? ", true, self.id])
:conditions => [ "visible = ? AND member_type='Way' and member_id=? ", true, self.id])
raise OSM::APIPreconditionFailedError.new("You need to make sure that this way is not a member of a relation.")
else
self.changeset_id = new_way.changeset_id