]> git.openstreetmap.org Git - rails.git/commitdiff
Add inverse_of to relationships that can't detect it automatically
authorTom Hughes <tom@compton.nu>
Wed, 23 Feb 2022 19:23:51 +0000 (19:23 +0000)
committerTom Hughes <tom@compton.nu>
Wed, 23 Feb 2022 19:23:51 +0000 (19:23 +0000)
20 files changed:
.rubocop.yml
.rubocop_todo.yml
app/models/diary_entry.rb
app/models/language.rb
app/models/node.rb
app/models/note.rb
app/models/old_node.rb
app/models/old_node_tag.rb
app/models/old_relation.rb
app/models/old_relation_member.rb
app/models/old_relation_tag.rb
app/models/old_way.rb
app/models/old_way_node.rb
app/models/old_way_tag.rb
app/models/relation.rb
app/models/trace.rb
app/models/tracepoint.rb
app/models/tracetag.rb
app/models/user.rb
app/models/way.rb

index aa60df305e2613659f470ffcafb57dce3c22941e..65db8a6a563522c536389729db7ec383aca9f0f6 100644 (file)
@@ -55,9 +55,6 @@ Rails/HasManyOrHasOneDependent:
 Rails/HttpPositionalArguments:
   Enabled: false
 
-Rails/InverseOf:
-  Enabled: false
-
 Rails/ReflectionClassName:
   Enabled: false
 
index 8c0827ab7d357f1bc2548d8200f27b2cc47a741a..2527192f9bcf970f4a6bd5c83d82ee9700dd0075 100644 (file)
@@ -1,6 +1,6 @@
 # This configuration was generated by
 # `rubocop --auto-gen-config`
-# on 2021-12-28 19:44:27 UTC using RuboCop version 1.24.0.
+# on 2022-02-23 19:11:04 UTC using RuboCop version 1.25.1.
 # The point is for the user to remove these configuration records
 # one by one as the offenses are removed from the code base.
 # Note that changes in the inspected code, or installation of new
@@ -14,7 +14,7 @@ require:
   - rubocop-rails
   - rubocop-rake
 
-# Offense count: 544
+# Offense count: 550
 # Cop supports --auto-correct.
 # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
 # URISchemes: http, https
@@ -63,12 +63,12 @@ Lint/DuplicateBranch:
     - 'app/controllers/geocoder_controller.rb'
     - 'app/helpers/browse_tags_helper.rb'
 
-# Offense count: 663
+# Offense count: 665
 # Configuration parameters: IgnoredMethods, CountRepeatedAttributes.
 Metrics/AbcSize:
   Max: 189
 
-# Offense count: 72
+# Offense count: 73
 # Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
 # IgnoredMethods: refine
 Metrics/BlockLength:
@@ -84,12 +84,12 @@ Metrics/BlockNesting:
 Metrics/ClassLength:
   Max: 313
 
-# Offense count: 57
+# Offense count: 58
 # Configuration parameters: IgnoredMethods.
 Metrics/CyclomaticComplexity:
   Max: 25
 
-# Offense count: 739
+# Offense count: 742
 # Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
 Metrics/MethodLength:
   Max: 179
@@ -104,7 +104,7 @@ Metrics/ParameterLists:
 Metrics/PerceivedComplexity:
   Max: 26
 
-# Offense count: 549
+# Offense count: 550
 Minitest/MultipleAssertions:
   Max: 52
 
@@ -155,7 +155,20 @@ Rails/HelperInstanceVariable:
   Exclude:
     - 'app/helpers/title_helper.rb'
 
-# Offense count: 1
+# Offense count: 16
+# Configuration parameters: IgnoreScopes, Include.
+# Include: app/models/**/*.rb
+Rails/InverseOf:
+  Exclude:
+    - 'app/models/changeset.rb'
+    - 'app/models/diary_entry.rb'
+    - 'app/models/friendship.rb'
+    - 'app/models/issue.rb'
+    - 'app/models/message.rb'
+    - 'app/models/note.rb'
+    - 'app/models/user.rb'
+
+# Offense count: 2
 # Configuration parameters: Include.
 # Include: app/controllers/**/*.rb
 Rails/LexicallyScopedActionFilter:
@@ -183,7 +196,7 @@ Rails/OutputSafety:
     - 'lib/rich_text.rb'
     - 'test/helpers/application_helper_test.rb'
 
-# Offense count: 23
+# Offense count: 26
 # Cop supports --auto-correct.
 Rails/RedundantPresenceValidationOnBelongsTo:
   Enabled: false
@@ -204,7 +217,7 @@ Rake/Desc:
     - 'lib/tasks/subscribe_diary_authors.rake'
     - 'lib/tasks/subscribe_old_changesets.rake'
 
-# Offense count: 609
+# Offense count: 617
 # Cop supports --auto-correct.
 # Configuration parameters: EnforcedStyle.
 # SupportedStyles: always, always_true, never
index 4ff1eeb35e57b0e8e3890dee62e2804761634215..e83dfb9ee47af81706161260781f7bb663a8fc88 100644 (file)
@@ -28,9 +28,9 @@
 
 class DiaryEntry < ApplicationRecord
   belongs_to :user, :counter_cache => true
-  belongs_to :language, :foreign_key => "language_code"
+  belongs_to :language, :foreign_key => "language_code", :inverse_of => :diary_entries
 
-  has_many :comments, -> { order(:id).preload(:user) }, :class_name => "DiaryComment"
+  has_many :comments, -> { order(:id).preload(:user) }, :class_name => "DiaryComment", :inverse_of => :diary_entry
   has_many :visible_comments, -> { joins(:user).where(:visible => true, :users => { :status => %w[active confirmed] }).order(:id) }, :class_name => "DiaryComment"
   has_many :subscriptions, :class_name => "DiaryEntrySubscription"
   has_many :subscribers, :through => :subscriptions, :source => :user
index cdf85a52bc3530cb11dc0eb3e0a05ed29d7f7a56..1158721e8de9cf062ff911bd6d6ee5028393d445 100644 (file)
@@ -10,7 +10,7 @@
 class Language < ApplicationRecord
   self.primary_key = "code"
 
-  has_many :diary_entries, :foreign_key => "language"
+  has_many :diary_entries, :foreign_key => "language", :inverse_of => :language
 
   def self.load(file)
     Language.transaction do
index 3214564c8e4fbf7c1eb15e75f953e9f187869c41..f6f0f258e4d3e9ef7eb10324cdd72858b7e3c4cd 100644 (file)
@@ -32,7 +32,7 @@ class Node < ApplicationRecord
 
   belongs_to :changeset
 
-  has_many :old_nodes, -> { order(:version) }
+  has_many :old_nodes, -> { order(:version) }, :inverse_of => :current_node
 
   has_many :way_nodes
   has_many :ways, :through => :way_nodes
index ea88599a4a9db66fbf4c2df046f171f850a25195..24ba6854dea3ec7efb646fca01b267dc4d33b14e 100644 (file)
@@ -22,7 +22,7 @@ class Note < ApplicationRecord
   include GeoRecord
 
   has_many :comments, -> { left_joins(:author).where(:visible => true, :users => { :status => [nil, "active", "confirmed"] }).order(:created_at) }, :class_name => "NoteComment", :foreign_key => :note_id
-  has_many :all_comments, -> { left_joins(:author).order(:created_at) }, :class_name => "NoteComment", :foreign_key => :note_id
+  has_many :all_comments, -> { left_joins(:author).order(:created_at) }, :class_name => "NoteComment", :foreign_key => :note_id, :inverse_of => :note
 
   validates :id, :uniqueness => true, :presence => { :on => :update },
                  :numericality => { :on => :update, :only_integer => true }
index 3caf0442b8d912fa15a7e014736bac8f6da28a31..1324c8139bc933bd05589fadc91ba883c8a3270a 100644 (file)
@@ -47,9 +47,9 @@ class OldNode < ApplicationRecord
 
   belongs_to :changeset
   belongs_to :redaction
-  belongs_to :current_node, :class_name => "Node", :foreign_key => "node_id"
+  belongs_to :current_node, :class_name => "Node", :foreign_key => "node_id", :inverse_of => :old_nodes
 
-  has_many :old_tags, :class_name => "OldNodeTag", :foreign_key => [:node_id, :version]
+  has_many :old_tags, :class_name => "OldNodeTag", :foreign_key => [:node_id, :version], :inverse_of => :old_node
 
   def validate_position
     errors.add(:base, "Node is not in the world") unless in_world?
index f2cba896cf031c7b8efbc14742e83977b197137c..11a2efd5a4b0749c42cea1f6bc67110eee92f0a2 100644 (file)
@@ -16,7 +16,7 @@ class OldNodeTag < ApplicationRecord
   self.table_name = "node_tags"
   self.primary_keys = "node_id", "version", "k"
 
-  belongs_to :old_node, :foreign_key => [:node_id, :version]
+  belongs_to :old_node, :foreign_key => [:node_id, :version], :inverse_of => :old_tags
 
   validates :old_node, :presence => true, :associated => true
   validates :k, :v, :allow_blank => true, :length => { :maximum => 255 }, :characters => true
index 29edb90adbee10227fab1f6fdff38ec788e661ac..71bd4b73dad7594acf0c6e8fac5f4b77259c7109 100644 (file)
@@ -32,10 +32,10 @@ class OldRelation < ApplicationRecord
 
   belongs_to :changeset
   belongs_to :redaction
-  belongs_to :current_relation, :class_name => "Relation", :foreign_key => "relation_id"
+  belongs_to :current_relation, :class_name => "Relation", :foreign_key => "relation_id", :inverse_of => :old_relations
 
-  has_many :old_members, -> { order(:sequence_id) }, :class_name => "OldRelationMember", :foreign_key => [:relation_id, :version]
-  has_many :old_tags, :class_name => "OldRelationTag", :foreign_key => [:relation_id, :version]
+  has_many :old_members, -> { order(:sequence_id) }, :class_name => "OldRelationMember", :foreign_key => [:relation_id, :version], :inverse_of => :old_relation
+  has_many :old_tags, :class_name => "OldRelationTag", :foreign_key => [:relation_id, :version], :inverse_of => :old_relation
 
   validates :changeset, :presence => true, :associated => true
   validates :timestamp, :presence => true
index 1714f3c859bc0df5d2af1d6f06bcd1151558db37..5bc2e22e00c70bc989acb92c365691aeafcb7f14 100644 (file)
@@ -22,7 +22,7 @@ class OldRelationMember < ApplicationRecord
   self.table_name = "relation_members"
   self.primary_keys = "relation_id", "version", "sequence_id"
 
-  belongs_to :old_relation, :foreign_key => [:relation_id, :version]
+  belongs_to :old_relation, :foreign_key => [:relation_id, :version], :inverse_of => :old_members
   # A bit messy, referring to the current tables, should do for the data browser for now
   belongs_to :member, :polymorphic => true
 end
index d6e6e19c2dfb921a4f4621e22f9d83b08b5f86c1..1fccdf7a841a52b559df91e4886b91438b4e4732 100644 (file)
@@ -16,7 +16,7 @@ class OldRelationTag < ApplicationRecord
   self.table_name = "relation_tags"
   self.primary_keys = "relation_id", "version", "k"
 
-  belongs_to :old_relation, :foreign_key => [:relation_id, :version]
+  belongs_to :old_relation, :foreign_key => [:relation_id, :version], :inverse_of => :old_tags
 
   validates :old_relation, :presence => true, :associated => true
   validates :k, :v, :allow_blank => true, :length => { :maximum => 255 }, :characters => true
index 7af8906b1a9a64b36ab371ab01b62e0411af146b..1f00c46ba6a3fbf8cd279235e873fa5ded52177e 100644 (file)
@@ -32,10 +32,10 @@ class OldWay < ApplicationRecord
 
   belongs_to :changeset
   belongs_to :redaction
-  belongs_to :current_way, :class_name => "Way", :foreign_key => "way_id"
+  belongs_to :current_way, :class_name => "Way", :foreign_key => "way_id", :inverse_of => :old_ways
 
-  has_many :old_nodes, :class_name => "OldWayNode", :foreign_key => [:way_id, :version]
-  has_many :old_tags, :class_name => "OldWayTag", :foreign_key => [:way_id, :version]
+  has_many :old_nodes, :class_name => "OldWayNode", :foreign_key => [:way_id, :version], :inverse_of => :old_way
+  has_many :old_tags, :class_name => "OldWayTag", :foreign_key => [:way_id, :version], :inverse_of => :old_way
 
   validates :changeset, :presence => true, :associated => true
   validates :timestamp, :presence => true
index d89227936aaf431b336f207b3aebcfe22538349a..9c8c0c6f3c1de533371bda729e8e185110723986 100644 (file)
@@ -20,7 +20,7 @@ class OldWayNode < ApplicationRecord
   self.table_name = "way_nodes"
   self.primary_keys = "way_id", "version", "sequence_id"
 
-  belongs_to :old_way, :foreign_key => [:way_id, :version]
+  belongs_to :old_way, :foreign_key => [:way_id, :version], :inverse_of => :old_nodes
   # A bit messy, referring to current nodes and ways, should do for the data browser for now
   belongs_to :node
   belongs_to :way
index 90bf704b6af2c1a5be5eb7c4ea4107d488a16a85..e684199bf4f49873c0960629064b7f1390cd6f47 100644 (file)
@@ -16,7 +16,7 @@ class OldWayTag < ApplicationRecord
   self.table_name = "way_tags"
   self.primary_keys = "way_id", "version", "k"
 
-  belongs_to :old_way, :foreign_key => [:way_id, :version]
+  belongs_to :old_way, :foreign_key => [:way_id, :version], :inverse_of => :old_tags
 
   validates :old_way, :presence => true, :associated => true
   validates :k, :v, :allow_blank => true, :length => { :maximum => 255 }, :characters => true
index 4200a08dd7c709da827e405759c7d5df968a5672..61ae45c99d24b65512ce480c55b70ad7dc9a81da 100644 (file)
@@ -27,9 +27,9 @@ class Relation < ApplicationRecord
 
   belongs_to :changeset
 
-  has_many :old_relations, -> { order(:version) }
+  has_many :old_relations, -> { order(:version) }, :inverse_of => :current_relation
 
-  has_many :relation_members, -> { order(:sequence_id) }
+  has_many :relation_members, -> { order(:sequence_id) }, :inverse_of => :relation
   has_many :relation_tags
 
   has_many :containing_relation_members, :class_name => "RelationMember", :as => :member
index bdafdd9d5c9116f4340ddd0af108fa86abbf549a..feefc077387b9ca32ea05ad247c2184de992ae8d 100644 (file)
@@ -31,8 +31,8 @@ class Trace < ApplicationRecord
   self.table_name = "gpx_files"
 
   belongs_to :user, :counter_cache => true
-  has_many :tags, :class_name => "Tracetag", :foreign_key => "gpx_id", :dependent => :delete_all
-  has_many :points, :class_name => "Tracepoint", :foreign_key => "gpx_id", :dependent => :delete_all
+  has_many :tags, :class_name => "Tracetag", :foreign_key => "gpx_id", :dependent => :delete_all, :inverse_of => :trace
+  has_many :points, :class_name => "Tracepoint", :foreign_key => "gpx_id", :dependent => :delete_all, :inverse_of => :trace
 
   scope :visible, -> { where(:visible => true) }
   scope :visible_to, ->(u) { visible.where("visibility IN ('public', 'identifiable') OR user_id = ?", u) }
index b3c37430d8624a0c61d419e1b8e2ae9bec23e3d6..d36ceb8c3c52606f21e74489ef2eabfeddc97169 100644 (file)
@@ -30,5 +30,5 @@ class Tracepoint < ApplicationRecord
   validates :trace, :associated => true
   validates :timestamp, :presence => true
 
-  belongs_to :trace, :foreign_key => "gpx_id"
+  belongs_to :trace, :foreign_key => "gpx_id", :inverse_of => :points
 end
index f13f7269fbb73625c712bcd7804a254b59661c63..70296cd54f15115c95a4dcac43d01f234539f554 100644 (file)
@@ -19,7 +19,7 @@
 class Tracetag < ApplicationRecord
   self.table_name = "gpx_file_tags"
 
-  belongs_to :trace, :foreign_key => "gpx_id"
+  belongs_to :trace, :foreign_key => "gpx_id", :inverse_of => :tags
 
   validates :trace, :associated => true
   validates :tag, :length => 1..255, :characters => { :url_safe => true }
index 7a0d069927fa5da20e6aeecee4a52a841d76b1e2..e7e077a9b7f20f20420ead56ddf738b8e353e914 100644 (file)
@@ -48,8 +48,8 @@ class User < ApplicationRecord
   include AASM
 
   has_many :traces, -> { where(:visible => true) }
-  has_many :diary_entries, -> { order(:created_at => :desc) }
-  has_many :diary_comments, -> { order(:created_at => :desc) }
+  has_many :diary_entries, -> { order(:created_at => :desc) }, :inverse_of => :user
+  has_many :diary_comments, -> { order(:created_at => :desc) }, :inverse_of => :user
   has_many :diary_entry_subscriptions, :class_name => "DiaryEntrySubscription"
   has_many :diary_subscriptions, :through => :diary_entry_subscriptions, :source => :diary_entry
   has_many :messages, -> { where(:to_user_visible => true).order(:sent_on => :desc).preload(:sender, :recipient) }, :foreign_key => :to_user_id
@@ -59,26 +59,26 @@ class User < ApplicationRecord
   has_many :friends, :through => :friendships, :source => :befriendee
   has_many :tokens, :class_name => "UserToken", :dependent => :destroy
   has_many :preferences, :class_name => "UserPreference"
-  has_many :changesets, -> { order(:created_at => :desc) }
-  has_many :changeset_comments, :foreign_key => :author_id
+  has_many :changesets, -> { order(:created_at => :desc) }, :inverse_of => :user
+  has_many :changeset_comments, :foreign_key => :author_id, :inverse_of => :author
   has_and_belongs_to_many :changeset_subscriptions, :class_name => "Changeset", :join_table => "changesets_subscribers", :foreign_key => "subscriber_id"
-  has_many :note_comments, :foreign_key => :author_id
+  has_many :note_comments, :foreign_key => :author_id, :inverse_of => :author
   has_many :notes, :through => :note_comments
 
   has_many :client_applications
-  has_many :oauth_tokens, -> { order(:authorized_at => :desc).preload(:client_application) }, :class_name => "OauthToken"
+  has_many :oauth_tokens, -> { order(:authorized_at => :desc).preload(:client_application) }, :class_name => "OauthToken", :inverse_of => :user
 
   has_many :oauth2_applications, :class_name => Doorkeeper.config.application_model.name, :as => :owner
   has_many :access_grants, :class_name => Doorkeeper.config.access_grant_model.name, :foreign_key => :resource_owner_id
   has_many :access_tokens, :class_name => Doorkeeper.config.access_token_model.name, :foreign_key => :resource_owner_id
 
   has_many :blocks, :class_name => "UserBlock"
-  has_many :blocks_created, :class_name => "UserBlock", :foreign_key => :creator_id
-  has_many :blocks_revoked, :class_name => "UserBlock", :foreign_key => :revoker_id
+  has_many :blocks_created, :class_name => "UserBlock", :foreign_key => :creator_id, :inverse_of => :creator
+  has_many :blocks_revoked, :class_name => "UserBlock", :foreign_key => :revoker_id, :inverse_of => :revoker
 
   has_many :roles, :class_name => "UserRole"
 
-  has_many :issues, :class_name => "Issue", :foreign_key => :reported_user_id
+  has_many :issues, :class_name => "Issue", :foreign_key => :reported_user_id, :inverse_of => :reported_user
   has_many :issue_comments
 
   has_many :reports
index 933cb7c8b81a5bc6a7e29c3e49ac5b16b6f09fd2..0c6e645b7e2ce40f89bf81ca2002a5c056550cf2 100644 (file)
@@ -27,9 +27,9 @@ class Way < ApplicationRecord
 
   belongs_to :changeset
 
-  has_many :old_ways, -> { order(:version) }
+  has_many :old_ways, -> { order(:version) }, :inverse_of => :current_way
 
-  has_many :way_nodes, -> { order(:sequence_id) }
+  has_many :way_nodes, -> { order(:sequence_id) }, :inverse_of => :way
   has_many :nodes, :through => :way_nodes
 
   has_many :way_tags