Hallo zusammen!
Habe eine Frage zu einem Magic Field: updated_at
Es ist ja ganz toll, dass Rails sich hier um das Speichern des Datums
bei Bearbeitung selbst kümmert. Aber kann man das in speziellen Fällen
auch unterdrücken? Konkret geht es darum, dass ich mit AJAX-Klimbim eine
Liste umsortiere, also nur die Spalte :positions ändere für alle
Einträge. Dann haben plötzlich alle Einträge den gleichen
updated_at-Zeitpunkt.
Wenn ich nachträglich sowas versuche:
eintrag.update_attribute(:updated_at,temp_date)
wobei ich in temp_date das Datum vor Positionsänderung gespeichert habe,
bringt das leider gar nichts.
Ärgerlich.
Hat jemand eine Idee?
Klar, ich könnte auf die Magic-Funktion verzichten und alles manuell
regeln. Aber gehts auch anders?
Vielen Dank schonmal und
Grüße,
Thomas V…
Als Workaround habe ich erstmal das hier gemacht:
temp_date = eintrag.updated_at
eintrag.save
sql = ActiveRecord::Base.connection();
sql.begin_db_transaction
sql.update “UPDATE eintraege
SET updated_at
=
'”+temp_date.to_s(:db)+"’ WHERE id
= "+eintrag.id.to_s
sql.commit_db_transaction
Also: ActiveRecord umgehen.
Vielleicht hat ja jemand einen Tipp, wie’s schöner geht.
Grüße,
Thomas.
Thomas V. schrieb:
On Monday 20 April 2009, Thomas V. wrote:
Also: ActiveRecord umgehen.
Vielleicht hat ja jemand einen Tipp, wie’s schöner geht.
Du könntest auf den betroffenen Objekten
obj.send(:changed_attributes).clear
aufrufen. Das sieht nur schöner aus, greift aber tief in die
Implementierung rein. Schau selbst in ActiveRecord::TimeStamp und
ActiveRecord::Dirty.
Michael
–
Michael S.
mailto:[email protected]
http://www.schuerig.de/michael/
On Monday 20 April 2009, Manuel W. wrote:
class Foo < ActiveRecord::Base
self.record_timestamps = false
end
du müsstest mal schauen, dass du das halt nur in der methode setzt,
die deine sortierung macht und nicht überall…
Der Nachteil daran ist, dass man damit garantiert Code bekommt, der
nicht Thread-sicher ist, sofern man nicht gerade ein riesiges Lock
irgendwo darum herum baut.
Michael
–
Michael S.
mailto:[email protected]
http://www.schuerig.de/michael/
probier das hier mal aus:
class Foo < ActiveRecord::Base
self.record_timestamps = false
end
du müsstest mal schauen, dass du das halt nur in der methode setzt,
die deine sortierung macht und nicht überall…
gerade wenn es nur ne kleine methode ist und danach sonst nix mehr mit
dem model gemacht wird, sollte das ziemlich einfach gehen…
in etwa so:
class Foo < ActiveRecord::Base
def update_position(position)
self.record_timestamps = false
update_attribute(:position, position)
end
end
gruß
manuel
Am 20.04.2009 um 00:25 schrieb Michael S.:
Danke für Eure Ideen!
Irgendwie lass ich’s wohl erstmal beim Zwischenspeichern und
nachträglichen überschreiben per SQL.
Datenbankunabhängigkeit brauche ich bei dem Projekt ohnehin nicht.
Und irgendwie scheint es mir auch so, dass es bei den Magic-Funktionen
einfach nicht vorgesehen ist, dass man da was dran rumdrehen kann.
So sehr ich Rails liebe, es ist dann doch oft so: Wenn man tief geht,
hat man fast mehr Arbeit, als wenn man von vorneherein alles selbst
gemacht hätte. - Aber klar, das fällt kaum ins Gewicht, wenn man die
Vorteile betrachtet.
Also, Danke nochmal und
Grüße,
Thomas.
Niko D. schrieb:
Am 21. April 2009 13:08 schrieb Thomas V. [email protected]:
So sehr ich Rails liebe, es ist dann doch oft so: Wenn man tief geht, hat
man fast mehr Arbeit, als wenn man von vorneherein alles selbst gemacht
hätte. - Aber klar, das fällt kaum ins Gewicht, wenn man die Vorteile
betrachtet.
Herzlichen Glückwunsch. Du hast das Prinzip von “Opinionated Software”
verstanden.
Viele Grüße
Nicolai
Das hier schon gesehen:
?
def do_sth_without_ts
class << self
def record_timestamps; false; end
end
do_sth…
class << self
remove_method :record_timestamps
end
end
Kommt mir allerdings ziemlich hackig vor…
Niko.