9

He estado jugando con STI y belongs_to/has_many relaciones y estoy un poco confundido.Rails Pregunta: belongs_to with STI - ¿cómo hago esto correctamente?

tengo unas pocas preguntas basadas en una configuración similar al modelo:

class Parental < ActiveRecord::Base 
end 

class Mother < Parental 
    has_many :babies 
end 

class Father < Parental 
    has_many :babies 
end 

class Baby < ActiveRecord::Base 
    belongs_to :?????? 
end 
  1. ¿Qué debe Baby belong_to?
  2. En términos de una migración, ¿qué debo nombrar/agregar para clave externa en la tabla babies?
  3. Me ha costado investigar esto, ¿hay una fuente definitiva que lo explique? Los documentos de la API no parecían pegarle en la cabeza O me lo perdí (lo cual es totalmente posible).

Mi primer pensamiento es poner a parental_idbabies junto con un método como Baby#owner que hace lo siguiente:

  • Golpea self.parental
  • Determina el tipo de la de los padres
  • devuelve el tipo correcto de parental (podría ser una madre, podría ser un padre)

Tha ¡tú!

Respuesta

7

El Baby pertenece a ambos Mother y Father

belongs_to :mother 
belongs_to :father 

Puede tener varias claves externas. La tabla Baby DB continuación, tiene dos campos, mother_id y father_id

La guía definitiva a las asociaciones está aquí: http://guides.rubyonrails.org/association_basics.html

la migración a crear la clase Baby sería algo como esto:

class CreateBabies < ActiveRecord::Migration 
    def self.up 
    create_table :babies do |t| 
     t.integer :father_id 
     t.integer :mother_id 
    end 
    end 

    def self.down 
    drop_table :babies 
    end 
end 

Este le da cosas como: baby.mother y baby.father. No puede tener un solo parental_id porque la clave externa solo puede apuntar a otro registro, lo que significa que los bebés solo tendrán un padre (cuando realmente tienen dos).

Parece que, en este caso, simplemente está malinterpretando la relación, eso es todo. Estás en el camino correcto.

+0

Gracias por responder. ¿Puedo molestarte para que mires @ mi actualización y comentes sobre esa solución?parece menos desorden en la mesa, pero podría estar totalmente equivocado. –

+0

Claro, comenté la solución 'parental_id', que no funcionará. – jefflunt

+0

AH! Eso tiene mucho sentido. Gracias de nuevo. Marqué tu respuesta como la solución. Tengo un seguimiento q espero que no sea demasiado molesto. Como mencionas, en esta situación realmente necesitas DOS propietarios como un niño (aparte de Jesús) siempre tendrá dos padres. ¿Qué haces cuando el objeto bajo propiedad solo puede pertenecer a 1 propietario? Por ejemplo, digamos un 'Post' y la configuración de STI es' Author', 'LivingAuthor

3

He resuelto un problema similar añadiendo una llamada foreignkey explícita.

Algo así como el código siguiente:

class Parental < ActiveRecord::Base 
end 

class Mother < Parental 
    has_many :babies 
end 

class Father < Parental 
    has_many :babies 
end 

class Baby < ActiveRecord::Base 
    belongs_to :mother, foreign_key: 'parental_id' 
    belongs_to :father, foreign_key: 'parental_id' 
end 

Por supuesto, esto supone que un bebé tiene sólo un padre. :-)

Cuestiones relacionadas