X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/dfc85f089abc60ad1bd481de670413fa509dc36c..03356be5887ec2075f68e42bf8fa0928fa0ce249:/app/models/relation.rb diff --git a/app/models/relation.rb b/app/models/relation.rb index b19f8aeb1..cb9621822 100644 --- a/app/models/relation.rb +++ b/app/models/relation.rb @@ -186,7 +186,7 @@ class Relation < ActiveRecord::Base self.lock! check_consistency(self, new_relation, user) # This will check to see if this relation is used by another relation - rel = RelationMember.joins(:relation).where("visible = ? AND member_type = 'Relation' and member_id = ? ", true, id).first + rel = RelationMember.joins(:relation).find_by("visible = ? AND member_type = 'Relation' and member_id = ? ", true, id) fail OSM::APIPreconditionFailedError.new("The relation #{new_relation.id} is used in relation #{rel.relation.id}.") unless rel.nil? self.changeset_id = new_relation.changeset_id @@ -246,8 +246,10 @@ class Relation < ActiveRecord::Base # use reflection to look up the appropriate class model = Kernel.const_get(m[0].capitalize) - # get the element with that ID - element = model.where(:id => m[1]).first + # get the element with that ID. and, if found, lock the element to + # ensure it can't be deleted until after the current transaction + # commits. + element = model.lock("for share").find_by(:id => m[1]) # and check that it is OK to use. unless element && element.visible? && element.preconditions_ok?