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

¿Fue útil?

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)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top