9

Ho giocato con STI e appartiene a/has_many relazioni e sono un po 'confuso.Domanda Rails: appartiene a STI - come faccio a farlo correttamente?

Ho un paio di domande basate su una configurazione modello simile a:

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. Che cosa dovrebbe Baby belong_to?
  2. In termini di migrazione, cosa devo nominare/aggiungere per chiave esterna su nella tabella babies?
  3. Ho avuto difficoltà a ricercare questo, esiste una fonte definitiva che spiega questo? I documenti API non sembrano averlo colpito in testa O mi sono perso (il che è totalmente possibile).

Il mio primo pensiero è aggiungere parental_id per babies insieme a un metodo come Baby#owner che fa la seguente:

  • Hits self.parental
  • Determina il tipo di genitori
  • Restituisce il corretto tipo di parentale (potrebbe essere una madre, potrebbe essere un padre)

Tha tu no!

risposta

7

La Baby appartiene ad entrambi Mother e Father

belongs_to :mother 
belongs_to :father 

è possibile avere più chiavi esterne. La tabella Baby DB ha poi due campi, mother_id e father_id

La guida definitiva per le associazioni è qui: http://guides.rubyonrails.org/association_basics.html

La migrazione per creare la classe Baby sarebbe simile a questa:

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 

Questo ti dà cose come: baby.mother e baby.father. Non è possibile avere un singolo parental_id perché la chiave esterna può solo puntare a un altro record, il che significa che i bambini avrebbero solo un genitore (quando in realtà ne hanno due).

Sembra, in questo caso, stai solo fraintendendo la relazione, tutto qui. Sei sulla strada giusta.

+0

Grazie per la risposta. Potrei disturbarti a guardare @ il mio aggiornamento e commentare questa soluzione?sembra meno ingombro da tavolo, ma potrebbe essere completamente sbagliato. –

+0

Certo, ho commentato la soluzione 'parental_id', che non funzionerà. – jefflunt

+0

AH! Questo ha perfettamente senso. Grazie ancora. Ho contrassegnato la tua risposta come la soluzione. Ho un follow up q che, spero, non sia un problema. Come hai detto, in questa situazione hai davvero bisogno di DUE proprietari come un bambino (a parte Gesù) avrà sempre due genitori. Che cosa fai quando l'oggetto di proprietà può appartenere solo a 1 proprietario? Per esempio, dì un 'Post' e il setup STI è' Author', 'LivingAuthor

3

Ho risolto personalmente un problema simile aggiungendo una chiamata foreign_key esplicita.

Qualcosa come il seguente codice:

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 

Naturalmente, questo presuppone che un bambino ha un solo genitore. :-)

Problemi correlati