Pergunta

Eu tenho um par de modelos no meu sistema:

  • Reputação usuário
  • Post Reputação
  • Reputação de resposta

(semelhante ao SO).

Assim, eles são share algum código básico:

  • incrementar e valores decrementing
  • a unique_id pertencentes às três objeto que a reputação representa (User, Post, Response)

Se houvesse C ++, eu teria uma superclasse chamada "Reputation" que encapsulam estes conceitos.

Atualmente, eu tenho três modelos, definidas separadamente, mas como eu construir o sistema que eu estou começando a perceber que há um monte de duplicação de código, etc.

Se eu fosse usar STI então eu teria que um campo owner_id que seria o object_id e uma owner_type.

Então, qual é a melhor maneira de lidar com este caso?

Foi útil?

Solução

Haverá algum código único em qualquer um dos modelos de reputação?

Se você não pode conviver com um belongs_to :owner, :polymorphic => true em um modelo de Reputação genérico.

Caso contrário, você deve ser capaz de conviver com fornecendo o:. Argumento class_name nas chamadas belongs_to em cada um dos submodelos

código para o modelo reputação única: (Necessidades Reputação owner_id: integer e owner_type: colunas de cordas)

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

Reputação Subclassificação (Tabela necessidades Reputação owner_id: inteiros e Tipo: String colunas)

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top