Magic: update_at unterdrüc ken?


#1

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…


#2

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:


#3

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:removed_email_address@domain.invalid
http://www.schuerig.de/michael/


#4

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:removed_email_address@domain.invalid
http://www.schuerig.de/michael/


#5

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.:


#6

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:


#7

Am 21. April 2009 13:08 schrieb Thomas V. removed_email_address@domain.invalid:

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. :slight_smile:

Viele Grüße
Nicolai


#8

Das hier schon gesehen:

http://blog.evanweaver.com/articles/2006/12/26/hacking-activerecords-automatic-timestamps/

?

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.