ruby-on-rails: Modelle mit Single-Table Vererbung zu schaffen?
-
05-07-2019 - |
Frage
Ich habe ein paar Modelle in meinem System:
- Benutzer Reputation
- Post Ruf
- Antwort Reputation
(ähnlich SO).
Also, sie sind einige grundlegende Code teilen:
- Erhöhen und Reduzieren Werte
- a unique_id das drei Objekt gehört, die der Ruf darstellt (Benutzer, Post, Response)
Wenn es C ++ wäre, würde ich eine übergeordnete Klasse haben „Reputation
“ genannt, die diese Konzepte kapseln würde.
Zur Zeit habe ich drei Modelle, separat definiert, sondern als ich das System bauen Ich beginne zu erkennen, eine Menge Code-Duplizierung ist usw.
Wenn ich STI verwenden, dann würde ich auf ein owner_id
Feld haben, die die object_id und ein owner_type
wäre.
Also, was ist der beste Weg, die diesen Fall bearbeitet?
Lösung
Wird es einen eindeutigen Code in jedem der Ruf-Modelle?
Wenn nicht, können Sie mit einem belongs_to :owner, :polymorphic => true
in einem allgemeinen Reputation Modell auszukommen.
Ansonsten sollten Sie in der Lage sein, mit zu erhalten, indem der Bereitstellung. In jedem der Submodelle class_name Arguments in den belongs_to Anrufen
-Code für Einzel Ruf Modell: (Reputation muss owner_id: integer und owner_type: String-Spalten)
class Reputation < ActiveRecord::Base
belongs_to :owner, :polymorphic => true
...
end
class User < ActiveRecord::Base
has_one :reputation, :as => :owner
end
class Post < ActiveRecord::Base
has_one :reputation, :as => :owner
end
class Response < ActiveRecord::Base
has_one :reputation, :as => :owner
end
Subclassing Ruf (Bewertungstabelle muss owner_id: integer und Typ: String-Spalten)
class Reputation < ActiveRecord::Base
...
end
class UserReputation < Reputation
belongs_to :owner, :class_name => "User"
...
end
class PostReputation < Reputation
belongs_to :owner, :class_name => "Post"
...
end
class ResponseReputation < Reputation
belongs_to :owner, :class_name => "Response"
...
end
class User < ActiveRecord::Base
has_one :user_reputation, :foreign_key => :owner_id
...
end
class Post < ActiveRecord::Base
has_one :post_reputation, :foreign_key => :owner_id
...
end
class Response < ActiveRecord::Base
has_one :response_reputation, :foreign_key => :owner_id
...
end