Problema con modelli ed ereditarietÃ

Ho i seguenti modelli.

class Core < ActiveRecord::Base
end

class Place < Core
belongs_to :locality
end

class Locality < ActiveRecord::Base
has_many :places
end

  • altri che ereditano sempre da Core.

Il modello core sul db ha questi attributi:
cores(id,name,type)

place invece:
places(core_id,locality_id,address)

e il modello locality:
localities(id,name)

Ora se da un controller inserisco questa riga ad es:
puts Locality.find(:first).places

ricevo questo errore:
Mysql::Error: Unknown column ‘cores.locality_id’ in ‘where clause’:
SELECT * FROM cores WHERE (cores.locality_id = 16001) AND (
(cores.type = ‘Place’ ) )

cosa devo fare per risolvere il problema?
Grazie

ActiveRecord si aspetta che ogni oggetto del model abbia una
corrispettiva tabella nel db. Tuttavia, esiste un caso particolare in
cui puoi associare più classi ad una tabella: è il Single Table
Inheritance (STI). Quindi se vuoi che Locality si riferisca a
localities, la sua superclasse deve essere ActiveRecord::Base e non
Core.

La struttura delle classi che hai impostato, viene interpretato da Rails
come una STI, per questo cerca la colonna locality_id in cores.

Spero di essere stato chiaro,
Ciao.


blog: www.lucaguidi.com

Speaker at:
Rails To Italy '07 Conference
Oct, 26-27 2007 - Pisa
www.railstoitaly.org

Perché mai? E’ un attributo in più da gestire (type, per convenzione)


blog: www.lucaguidi.com

Speaker at:
Rails To Italy '07 Conference
Oct, 26-27 2007 - Pisa
www.railstoitaly.org

Ma con il Single Table Inheritance nn c’è un grande spreco di memoria?

Luca G. wrote:

Perché mai? E’ un attributo in più da gestire (type, per convenzione)

ogni volta che inserisco un nuovo record di una certa classe che estende
cores tutti gli attributi che nn fanno parte di quella classe verranno
settati a null.
Quindi occuperanno una certa quantità di memoria (a seconda del tipo di
attributo).

Dato que ho molte classi che estendono cores, in ogni riga di sanno
molti valori settati a null e quindi molta memoria occupata inutilmente.

sbaglio?

— Luca R. [email protected] wrote:

Quindi occuperanno una certa quantità di memoria (a
seconda del tipo di
attributo).

si, ogni record conterrà potenzialmente tutti i campi,
settati a null, ma non è uno spreco spaventoso di
memoria e non te ne dovresti preoccupare.
L’alternativa è implementarsi da zero un sistema per
l’ereditarietà multi-tabella, che è possibile ma imo
non è una buona idea.

Dato que ho molte classi che estendono cores, in
ogni riga di sanno
molti valori settati a null e quindi molta memoria
occupata inutilmente.

sbaglio?

sono solo puntatori a null. Pochi byte sprecati,
dubito che sarà quello il collo di bottiglia
dell’applicazione :slight_smile:

  ___________________________________________________________

Want ideas for reducing your carbon footprint? Visit Yahoo! For Good
http://uk.promotions.yahoo.com/forgood/environment.html

Luca R. ha scritto:

ogni volta che inserisco un nuovo record di una certa classe che estende
cores tutti gli attributi che nn fanno parte di quella classe verranno
settati a null.
Quindi occuperanno una certa quantità di memoria (a seconda del tipo di
attributo).
Il tutto dipende da come usi la STI.


blog: www.lucaguidi.com

Speaker at:
Rails To Italy '07 Conference
Oct, 26-27 2007 - Pisa
www.railstoitaly.org