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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top