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
___________________________________________________________
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