¿Qué es un buen diseño para un modelo intermedio de triple relación?
-
08-07-2019 - |
Pregunta
Soy nuevo en Rails y todavía no entiendo todas las posibilidades con asociaciones. Aquí está mi problema:
Tengo un par de modelos como manzana y limón. Luego está el modelo de "relación" que contiene triples de relaciones:
asunto | relación | objeto
manzana | es más dulce que | limón
La migración para 'relaciones' es esta:
create_table :relations do |t| t.references :subject, :polymorphic => true t.string :relation t.references :object, :polymorphic => true t.timestamps end
esto debería almacenar relaciones como
subject_id = 1
subject_type = manzana
relación = es más dulce que
object_id = 2
object_type = limón
En realidad, tengo más que solo 2 modelos, así que pensé que necesitaba hacer que la columna de sujeto y objeto sea independiente del modelo usando la opción polimórfica.
¿Cómo establecería las asociaciones en las clases modelo de manzana, limón y relación? ¿El diseño de la tabla de relaciones es bueno así?
¡Muchas gracias por tu ayuda!
-Alex
Solución
Proporcione el esquema db que describió, parece que debería ser bastante sencillo:
class Relation < ActiveRecord::Base
belongs_to :object, :polymorphic => true
belongs_to :subject, :polymorphic => true
end
Y tus otras clases se verían así
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
Otros consejos
Polimórfico ES DOLOR:
A menos que lo necesite con urgencia, use algo como Herencia de tabla única:
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
Y luego como:
class Apple < Fruit
...
end
Espero que ayude (no probé este código)