Voglio rinominare le colonne di timestamp definite in timestamp.rb. I metodi di timestamp.rb possono essere sovrascritti? E cosa si deve fare nell'applicazione che viene utilizzato il modulo con i metodi sovrascritti.Rinominare le colonne created_at, updated_at di ActiveRecord/Rails
risposta
Non c'è un modo semplice per farlo. Puoi eseguire questa operazione eseguendo l'override del modulo ActiveRecord :: Timestamp o scrivendo la tua per eseguire la magia per te.
Here is come funziona la magia.
rapido brutto hack, elaborando dalla risposta di Milano Novota: aggiungere il seguente al environment.rb, sostituendo i valori delle CREATED_COL e UPDATED_COL costanti con i nomi delle colonne desiderati:
module ActiveRecord
module Timestamp
CREATED_COL = 'created_at'
UPDATED_COL = 'updated_at'
private
def create_with_timestamps #:nodoc:
if record_timestamps
t = self.class.default_timezone == :utc ? Time.now.utc : Time.now
write_attribute(CREATED_COL, t) if respond_to?(CREATED_COL) && send(CREATED_COL).nil?
write_attribute(UPDATED_COL, t) if respond_to?(UPDATED_COL) && send(UPDATED_COL).nil?
end
create_without_timestamps
end
def update_with_timestamps(*args) #:nodoc:
if record_timestamps && (!partial_updates? || changed?)
t = self.class.default_timezone == :utc ? Time.now.utc : Time.now
write_attribute(UPDATED_COL, t) if respond_to?(UPDATED_COL)
end
update_without_timestamps(*args)
end
end
end
Grazie, questa è una buona soluzione. –
Rails 3 ha reso questa soluzione obsoleta. Controlla quello di @NPatel per quello aggiornato. –
Si prega di smettere di usare patch scimmia. – sickill
o si può solo rendere la vostra proprie colonne (DateTime) e imposta manualmente manualmente la colonna created_at quando crei e imposti la colonna updated_at quando aggiorni. Quello potrebbe essere più facile dell'hack sopra. Questo è quello che farò. Meglio ancora, aggiorna i binari per permetterci di cambiare questi nomi.
Questo può essere fatto semplicemente scrivendo i metodi del modulo ActiveRecord :: Timestamp. In realtà non sovrascrive l'intero modulo. Ho bisogno di raggiungere questo stesso obiettivo mentre sto lavorando con un database legacy. Sono su Rails 3 e ho iniziato a seguire una metodologia su come eseguire il patch di patch sul mio codice con funzionalità di scrittura over rails.
Prima creo il progetto di base con cui sto lavorando e creo un file chiamato quello negli inizializzatori. In questo caso ho creato active_record.rb. E all'interno del file ho inserito il codice per sovrascrivere due metodi che controllavano il timestamp. Di seguito è riportato l'esempio del mio codice:
module ActiveRecord
module Timestamp
private
def timestamp_attributes_for_update #:nodoc:
["updated_at", "updated_on", "modified_at"]
end
def timestamp_attributes_for_create #:nodoc:
["created_at", "created_on"]
end
end
end
NOTA: Vorrei anche ricordare che questo tipo di scimmia patching per ottenere le cose al lavoro è visto di buon occhio e potrebbe rompersi per gli aggiornamenti in modo da essere attenti e essere pienamente consapevole di cosa vuoi fare.
Aggiornamenti:
- cambiare i nomi delle colonne timestamp da simbolo a stringa per api change. Grazie a Techbrunch per aver portato questa modifica dell'API alla mia attenzione.
Ottimo consiglio, ho salvato la giornata! –
Si prega di smettere di usare patch scimmia. – sickill
Questa risposta non è aggiornata, è necessario aggiornare il codice poiché 'timestamp_attributes_for_ {create, update}' è stato [modificato da simbolo a stringa] (https://github.com/rails/rails/commit/2b5dacb43dd92e98e1fd240a80c2a540ed380257). – Techbrunch
Penso che il metodo di NPatel sia un approccio corretto, ma sta facendo troppo nel caso in cui sia necessario modificare #created_at su un singolo modello. Poiché il modulo Timestamp è incluso in ogni oggetto AR, è possibile sovrascriverlo per modello, non a livello globale. Di ':
class User < ActiveRecord::Base
...
private
def timestamp_attributes_for_create
super << :registered_at
end
end
Solo un FYI :)
È ancora valido per Rails 5.1? Non sembra funzionare. – zmanw
Questo metodo appartiene alla classe invece di un'istanza in Rails 5.1, quindi ora è 'private_class_method def self.timestamp_attributes_for_create' –
è possibile utilizzare la BeforeSave e metodi beforecreate di inviare il DateTime.now alle vostre colonne specificate.
class Sample < ActiveRecord::Base
before_create :set_time_stamps
before_save :set_time_stamps
private
def set_time_stamps
self.created_column = DateTime.now if self.new_record?
self.updated_column = DateTime.now
end
end
Questo aggiornerà' created_column' ogni volta che si aggiorna il record –
corretto. Grazie.. –
Un sol'n che non utilizza un patch di scimmia; utilizzare il blocco reversible
durante la migrazione:
class CreateTest < ActiveRecord::Migration
def change
create_table :test do |t|
end
# set the timestamp columns default to now()
reversible do |dir|
dir.up do
tables = [
:test
]
tables.each do |t|
execute <<-SQL
ALTER TABLE #{t.to_s}
add column created timestamp without time zone default now();
SQL
execute <<-SQL
ALTER TABLE #{t.to_s}
add column updated timestamp without time zone default now();
SQL
end
end
dir.down do
# no need to do anything, the rollback will drop the tables
end
end
end
end
La sintassi corretta per fare questo in rotaie 4.2
class User < ActiveRecord::Base
...
private
def timestamp_attributes_for_create
super << 'date_add'
end
def timestamp_attributes_for_update
super << 'date_update'
end
end
- 1. Da dove provengono le colonne created_at e updated_at?
- 2. Eloquente sincronizzazione e created_at/updated_at
- 3. Cambiare il nome di created_at del laravel e updated_at
- 4. Rinominare le colonne denominate
- 5. Laravel Eloquent created_at si aggiorna
- 6. Disattiva colonna "updated_at" in Rails
- 7. laravel: Unknown column 'updated_at'
- 8. In SAS utilizzare il ciclo per rinominare le colonne indicizzate?
- 9. errore 1067 (42000): valore di default non valido per 'created_at'
- 10. Rails Partecipa Modello selezionare le colonne comuni
- 11. Modifica updated_at in un record Rails
- 12. Rinominare le colonne di una tabella SQL con i valori di campo di una tabella
- 13. Rinominare le chiavi di un dizionario
- 14. Come posso fare questo? Model.where ("created_at> = # {Time.now - 5.days}")
- 15. Cambia formato di created_at in Rails 3.1?
- 16. Rinominare i nomi delle colonne nel database postgresql
- 17. Passa la variabile a tidyr's gather per rinominare le colonne chiave/valore?
- 18. Esportare dati da Postgres a json e rinominare le colonne del fly
- 19. Come modificare il formato created_at
- 20. analisi del Twitter API created_at
- 21. Come rinominare le sessioni R in ESS?
- 22. PHP rinominare le chiavi dell'array nell'array multidimensionale
- 23. Come rinominare le rotte REST nell'URL?
- 24. Rinominare le directory con Fossil DVCS
- 25. "Touch" nella colonna updated_at in Rails 2.3.2
- 26. Rinominare la tabella dbo.AspNetUsers
- 27. Qual è il modo più semplice per impostare tutti gli attributi (tranne id, created_at, updated_at) di un oggetto ActiveRecord su zero?
- 28. Rails 3.2 + MySQL: Errore: Il campo 'created_at' non ha un valore predefinito: INSERT INTO
- 29. Riordina le colonne del dataframe ignorando le colonne non identificate
- 30. Indice tutte le colonne
FYI, il collegamento sopra riportato è per una versione precedente di Rails (2?). Se si utilizza Rails 3, vedere la risposta di NPatel. – Jared
[Qui] (https://github.com/rails/rails/blob/master/activerecord/lib/active_record/timestamp.rb) il modello dal ramo master rails – user980085