Qual é um bom design para um modelo intermediário de relação tripla?
-
08-07-2019 - |
Pergunta
Sou novo no Rails e ainda não entendi todas as possibilidades com associações. Aqui está o meu problema:
Eu tenho alguns modelos como Apple e Lemon. Depois, há a 'relação' do modelo que mantém triplos de relações:
Assunto | relação | objeto
Apple | é mais doce que | limão
A migração para 'relações' é esta:
create_table :relations do |t| t.references :subject, :polymorphic => true t.string :relation t.references :object, :polymorphic => true t.timestamps end
Isso deve armazenar relações como
sujeito_id = 1
sujeito_type = Apple
relação = é mais doce que
object_id = 2
object_type = limão
Na realidade, tenho mais do que apenas 2 modelos, então pensei em tornar o assunto e o modelo-agnóstico da coluna de objeto usando a opção polimórfica.
Como você definiria as associações nas classes modelo de maçã, limão e relação? O design da tabela de relações é bom assim?
Muito obrigado pela sua ajuda!!
-Alex
Solução
Dê ao esquema do banco de dados que você descreveu, parece que deve ser bastante direto:
class Relation < ActiveRecord::Base
belongs_to :object, :polymorphic => true
belongs_to :subject, :polymorphic => true
end
E suas outras aulas seriam assim
class Apple < ActiveRecord::Base
has_many :object_relations, :class_name => 'Relation', :as => :object
has_many :subject_relations, :class_name => 'Relation', :as => :subject
end
class Orange < ActiveRecord::Base
has_many :object_relations, :class_name => 'Relation', :as => :object
has_many :subject_relations, :class_name => 'Relation', :as => :subject
end
Outras dicas
Polimórfico é dor:
A menos que você precise mal, use algo como o SingLetableInertance:
class Fruit < ActiveRecord::Base
has_many :relations
has_many :related_objects, :through => :relation, :class_name => 'Fruit'
has_many :relating_subjects, :through => :relation, :class_name => 'Relation'
end
class Relation < ActiveRecord::Base
belongs_to :object, :class => 'Fruit'
belongs_to :subject, , :class => 'Fruit'
validate_presence_of :object_id
validate_presence_of :subject_id
validate_presence_of :relation
end
E então gosto:
class Apple < Fruit
...
end
Espero que ajude (eu não testei este código)