Dopo aver creato una tabella (tramite migrazione), desidero inserire alcune voci direttamente. Come devo scrivere una migrazione per questo?Come aggiungere alcuni inserti nella migrazione delle rotaie?
grazie
Dopo aver creato una tabella (tramite migrazione), desidero inserire alcune voci direttamente. Come devo scrivere una migrazione per questo?Come aggiungere alcuni inserti nella migrazione delle rotaie?
grazie
Aggiornamento: Questa è la risposta giusta: https://stackoverflow.com/a/2667747/7852
Ecco un esempio da ruby on rails api:
class AddSystemSettings < ActiveRecord::Migration
# create the table
def self.up
create_table :system_settings do |t|
t.string :name
t.string :label
t.text :value
t.string :type
t.integer :position
end
# populate the table
SystemSetting.create :name => "notice", :label => "Use notice?", :value => 1
end
def self.down
drop_table :system_settings
end
end
creare un nuovo file di migrazione come 047_add_rows_in_system_settings.rb
class AddRowsInAddSystemSettings < ActiveRecord::Migration
def self.up
SystemSetting.create{:name => "name1", :label => "Use notice?", :value => 1}
SystemSetting.create{:name => "name2", :label => "Use notice?", :value => 2}
end
def self.down
SystemSetting.delete_all
end
end
O
creando tabella
046_system_settings.rb
class AddSystemSettings < ActiveRecord::Migration
def self.up
create_table :system_settings do |t|
t.string :name
t.string :label
t.text :value
t.string :type
t.integer :position
end
SystemSetting.create :name => "notice", :label => "Use notice?", :value => 1
end
def self.down
drop_table :system_settings
end
end
Ref: - http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
mi piace questo approccio, ma mi chiedo se questo è davvero una buona pratica? L'utente sopra suggerisce che non lo è. – Tronathan
Non voglio votare, ma è una cattiva pratica, come hai affermato tu, @Tronathan. Leggi il mio commento sopra e non commettere lo stesso errore che ho fatto. – mkralla11
Non. Se stai cercando dati seme, dovresti usare db/seeds.rb
e rake db:seed
. More info in this Railscast.
Tuttavia, se è necessario inserire o modificare i dati all'interno di una migrazione, è preferibile utilizzare invece istruzioni SQL. La classe del modello non è garantita per essere ancora nella stessa forma in una versione futura dell'applicazione e l'esecuzione delle migrazioni da zero in futuro potrebbe generare errori se si fa riferimento direttamente alla classe del modello.
execute "insert into system_settings (name, label, value) values ('notice', 'Use notice?', 1)"
Esattamente quello che stavo scrivendo. La versione scritta di Railscast è disponibile qui: http://asciicasts.com/episodes/179-seed-data –
Sei così incredibilmente giusto è ridicolo. Ho completamente rovinato tutto pensando che fosse bello scrivere migrazioni che seminano le tue tabelle. Terribile. Terribile. Terribile. Se non ti fidi di questa risposta, fidati di me quando dico "i tuoi modelli SARANNO e cambino con il passare del tempo man mano che aggiorni il tuo codice". Quando si verifica questo, le migrazioni di seeding sono danneggiate e si PERDONO DATI .... (per fortuna, mi occupo di backup). Ora devo solo capire come rimettere i miei dati in automatico dopo il fatto. – mkralla11
Ci sono vantaggi nell'individuare i tuoi dati con la migrazione che crea la sua tabella. Forse il tavolo non ha senso se vuoto. Forse vuoi estendere il controllo delle versioni db dei binari ai dati. Forse pensi che usare solo un file per tutti i dati di seed/configuration sia loco (lo è!). Non è necessario essere dogmatici per dire "MAI" aggiungere dati nelle migrazioni, se l'unica ragione è che farlo tramite i modelli è sbagliato. Dico solo questo perché si tratta di una domanda ad alto volume, e sapere come farlo bene è ciò che il poster ha chiesto. –
L'utilizzo può utilizzare i dati seme, è un ottimo modo per questo! http://railscasts.com/episodes/179-seed-data
Modifica: NOTA: i poster riportati sopra sono corretti, non è necessario popolare il DB all'interno delle migrazioni. Non utilizzare questo per aggiungere nuovi dati, ma solo per modificare i dati come parte della modifica dello schema.
Per molte cose, è preferibile utilizzare SQL raw, ma se è necessario inserire dati come parte di una migrazione (ad esempio, eseguire la conversione dei dati quando si suddivide una tabella in più tabelle) e si desidera un valore predefinito roba AR come conveniente fuga DB-indipendenti, è possibile definire una versione locale della classe del modello:
class MyMigrationSucksALittle < ActiveRecord::Migration
class MyModel < ActiveRecord::Base
# empty guard class, guaranteed to have basic AR behavior
end
### My Migration Stuff Here
### ...
end
si noti che questo funziona meglio per i casi semplici; poiché la nuova classe si trova in un diverso spazio dei nomi (MyMigrationSucksALittle::MyModel
), le associazioni polimorfiche dichiarate nel modello di guardia non funzioneranno correttamente.
Una panoramica un po 'più dettagliata delle opzioni disponibili si trova qui: http://railsguides.net/2014/01/30/change-data-in-migrations-like-a-boss/
L'utilizzo di un modello è una cattiva pratica in quanto i modelli cambiano nel tempo, in base alla risposta seguente: utilizzare SQL –
Come menzionato da altri, non è l'approccio corretto. Vedi questa risposta: http://stackoverflow.com/a/2667747/7852 – givanse