ruby-on-rails: criando modelos com herança única tabela?
-
05-07-2019 - |
Pergunta
Eu tenho um par de modelos no meu sistema:
- Reputação usuário
- Post Reputação
- Reputação de resposta ??li>
(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?
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