]> git.openstreetmap.org Git - rails.git/blobdiff - app/models/way.rb
Fix bug allowing created elements to reference deleted ones
[rails.git] / app / models / way.rb
index 9b1765d12d3c88ed3d4a41cf8084cce578cc9d2b..6d49735f1406bee653d02783eae58ab076b7e5fc 100644 (file)
@@ -19,13 +19,15 @@ class Way < ActiveRecord::Base
   has_many :containing_relation_members, :class_name => "RelationMember", :as => :member
   has_many :containing_relations, :class_name => "Relation", :through => :containing_relation_members, :source => :relation
 
-  validates_presence_of :id, :on => :update
-  validates_presence_of :changeset_id, :version,  :timestamp
-  validates_uniqueness_of :id
-  validates_inclusion_of :visible, :in => [true, false]
-  validates_numericality_of :changeset_id, :version, :integer_only => true
-  validates_numericality_of :id, :on => :update, :integer_only => true
-  validates_associated :changeset
+  validates :id, :uniqueness => true, :presence => { :on => :update },
+                 :numericality => { :on => :update, :integer_only => true }
+  validates :version, :presence => true,
+                      :numericality => { :integer_only => true }
+  validates :changeset_id, :presence => true,
+                           :numericality => { :integer_only => true }
+  validates :timestamp, :presence => true
+  validates :changeset, :associated => true
+  validates :visible, :inclusion => [true, false]
 
   scope :visible, -> { where(:visible => true) }
   scope :invisible, -> { where(:visible => false) }
@@ -81,16 +83,6 @@ class Way < ActiveRecord::Base
     way
   end
 
-  # Find a way given it's ID, and in a single SQL call also grab its nodes
-  #
-
-  # You can't pull in all the tags too unless we put a sequence_id on the way_tags table and have a multipart key
-  def self.find_eager(id)
-    Way.find(id, :include => { :way_nodes => :node })
-    # If waytag had a multipart key that was real, you could do this:
-    # Way.find(id, :include => [:way_tags, {:way_nodes => :node}])
-  end
-
   # Find a way given it's ID, and in a single SQL call also grab its nodes and tags
   def to_xml
     doc = OSM::API.new.get_xml_doc
@@ -207,7 +199,9 @@ class Way < ActiveRecord::Base
     new_nds = (nds - old_nodes).sort.uniq
 
     unless new_nds.empty?
-      db_nds = Node.where(:id => new_nds, :visible => true)
+      # NOTE: nodes are locked here to ensure they can't be deleted before
+      # the current transaction commits.
+      db_nds = Node.where(:id => new_nds, :visible => true).lock("for share")
 
       if db_nds.length < new_nds.length
         missing = new_nds - db_nds.collect(&:id)
@@ -240,11 +234,6 @@ class Way < ActiveRecord::Base
     end
   end
 
-  # Temporary method to match interface to nodes
-  def tags_as_hash
-    tags
-  end
-
   ##
   # if any referenced nodes are placeholder IDs (i.e: are negative) then
   # this calling this method will fix them using the map from placeholders