Domanda

Ciao a tutti, ho qualcosa di interessante un requisito per il mio progetto. Ho bisogno di un rapporto has_one in cui è o una classe o l'altro, ma senza eredità. Potrei farla franca eredità se è l'unico modo, ma i due record associati hanno dati completamente diversi e non sono legati a tutti.

Quello che ho bisogno di capire è qualcosa di simile alla seguente.

# 1. Foo never belongs to anything.
# 2. Foo MUST have one assigned sub-record for validity.
# 3. Foo can only have either Bar or Baz assigned.
# 4. Bar and Baz have only ONE common property, and aren't
#    related in either data or implementation.

class Foo < ActiveRecord::Base
  # Attributes: id, name, value
  has_one :assignment, :foreign_key => 'assigned_to', :readonly => true
          # Could really use an :object_type for has_one here...
end

class Bar < ActiveRecord::Base
  # Attributes: name,...
end

class Baz < ActiveRecord::Base
  # Attributes: name,...
end

Dove Foo ha un compito, di tipo sia Bar o Baz; essi condividono una sola colonna comune, quindi forse posso fare un oggetto principale da questo. Tuttavia, se li faccio ereditano da un oggetto comune (quando i dati in essi contenuti è davvero arance e mele) devono faccio un tavolo per il record? Posso forse farla franca se il record è un record di astratto, ma i bambini non sono?

Credo che da ora si può vedere la mia difficoltà. Sono piuttosto nuovo per RoR ma amandolo finora. Sono sicuro che c'è un modo per aggirare questo, ma io rammendare se non riesco a capire cosa sia.

È stato utile?

Soluzione

Si sta cercando di modellare qualcosa che non va bene il paradigma database relazionale. Tutti i riferimenti in SQL hanno la stessa origine e di destinazione.

FWIW, polimorfi associazioni è anche un anti-modello perché rompe questa regola. Dovrebbe essere un indizio che si tratta di un disegno rotto quando il documentazione dice è necessario rinunciare ad un vincolo di integrità referenziale per farlo funzionare!

È necessario Foo di avere due relazioni has_one : una per bar ed una a Baz. Quindi implementare una logica classe per cercare di assicurare solo riferimento viene compilata in qualsiasi istanza di Foo. Cioè, dei riferimenti a Bar e Baz, uno deve avere un valore e l'altro deve essere pari a zero, ma questo è qualcosa per il codice per controllare e far rispettare.

Altri suggerimenti

Forse un modo per fare questo, è quello di creare associazioni di HAS-uno in Foo, per bar e Baz. Quindi creare un metodo chiamato assegnazione e assegnazione = che può essere il modo unica per accedere Bar e Baz. È possibile verificare quale delle due has_ones non è pari a zero nel metodo get e restituire quello. Nel metodo assegnazione, è possibile controllare-qual è il tipo di variabile passata e impostare la corretta ha uno relazione a tale oggetto e impostare l'altro a zero. Questo dovrebbe coprire tutte le basi, senza essere troppo complicato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top