Définir manuellement updated_at dans les Rails
Je suis la migration de mon ancien blog en mon nouveau Rails blog, et je veux leur updated_at
attribut correspondent à la valeur correspondante sur mon ancien blog (pas la date à laquelle ils ont été migrés dans ma nouvelle Rails blog).
Comment puis-je faire cela? Lorsque j'ai mis updated_at
manuellement, il obtient remplacée par la before_save
de rappel.
Remarque: Cette question n'est valable que pour les Rails < 3.2.11. Les nouvelles versions de Rails de vous permettre de définir manuellement les horodatages sans être écrasé.
- Comment vous mettez-vous
created_at
? Je n'ai pas le même comportement sur les rails 2.3.3. Il semble que je puisse régler lecreated_at
à ce que je veux, mais ne peut pas définirupdated_at
, qui semble être ce que Andy solution de bugs de ce que j'ai lu en ligne à ce jour. - Oups! Bon point -- vous pouvez définir
created_at
tout ce que vous voulez. (Cependant, j'ai aussi besoin de définirupdated_at
, afin d'Andy réponse est encore bonne) - Ressemble à ce qui a été changé dans de nouveaux Rails versions. Avec 3.2.11,
updated_at
peut être défini pour les nouveaux et les dossiers existants et ne seront pas remplacées par ActiveRecord.
Vous devez vous connecter pour publier un commentaire.
Si c'est une chose que vous pouvez activer
record_timestamps
sur on ou off.Quand j'ai rencontré ce problème avec mon application, j'ai cherché un peu et cela semblait qu'il avait le plus de sens pour moi. C'est un initialiseur que je peux appeler où j'ai besoin de:
Que de récentes versions de Rails (3.2.11 comme par iGELs commentaire) vous pouvez régler la updated_at propriété dans le code et le changement seront à l'honneur lors de l'enregistrement.
Je suppose que rails est de garder la trace de "sale" les propriétés ont été modifiées manuellement et ne pas écraser sur enregistrer.
Donc à réponse courte, les solutions ne sont pas nécessaire, pas plus dans les dernières versions de rails.
record_timestamps
à moins que vous ne les voulez pas écrit. Sinon, il suffit de définir ce que vous voulez.J'ai pris Andy réponse et l'a modifié pour accepter les blocs:
C'est aussi Andy Gaskell réponse:
class_inheritable_writer
est obsolète dans la dernière version de Rails. (>=3.1.0)Je vois deux façons de faire cela:
touch (Rails 5)
Dans les Rails 5, vous pouvez utiliser le
touch
méthode et de donner un paramètre nommétime
comme décrit dans la documentation de contactupdate_column (Rails >=3.1)
Si vous le souhaitez dans les Rails 4 et inférieur ou voulez éviter tous les rappels vous pouvez utiliser l'un des
update_column
ouupdate_columns
méthodes qui contourner en toute sécurité ou de toucher des rappels et des validationsou
La solution est de mettre temporairement de ActiveRecord::Base.record_timestamps false:
Si vous voulez un peu plus robuste solution, vous pouvez essayer quelque chose comme ce que mrm suggéré:
Alors vous pouvez facilement apporter des modifications à des modèles sans les horodatages d'être mis à jour automatiquement:
Ou, si vous voulez mettre à jour des enregistrements à partir d'une classe spécifique, sans horodatage:
E. g:
Ou vous pouvez utiliser une approche similaire à ce que Venkat D. suggéré, qui fonctionne par exemple de base:
E. g: