Witam
W jaki sposób kasować klucze wraz z wartościami z rekordu hstore ? Próbowałem hstore_field.delete(“space_id”) i mimo że kasuje z obiektu to zmiany nie zapisują się po użyciu save.
Przykładowy log
Project Load (1.0ms) SELECT "projects".* FROM "projects" ORDER BY "projects"."id" DESC LIMIT 1
=> #<Project id: 41, created_at: "2013-08-26 15:04:09", updated_at: "2013-08-27 07:54:37", name: "Projekcik", context: {"space_id"=>"16"}>
1.9.3p194 :486 > p.context.delete("space_id")
=> "16"
1.9.3p194 :487 > p.save
(0.2ms) BEGIN
Project Exists (0.6ms) SELECT 1 AS one FROM "projects" WHERE (id != 41 AND name = 'Projekcik' AND context @> ('space_id' => '')) LIMIT 1
(0.4ms) COMMIT
p.context = {}
p.save
p.context = p.context.except :space_id # metoda z ActiveSupport
p.save
Czasem w context jest więcej niż jeden klucz, wiec nie moge użyć p.context = {}
Doszedłem już jak to nadpisać ale nadal nie rozumiem czemu aż tak musze kombinować.
Kod ten załączam do modeli za pomocą concerns
key = "space_id"
new_context = send('context')
new_context.delete(key)
self.reload
self.update_attributes context: new_context.symbolize_keys
Z jakiś powodów jeśli klucze były stringami to nie kasowało mi ich.
Jeśli nie korzystasz z activerecord-postgres-hstore, to moim zdaniem najprościej byłoby użyć albo p.context = p.context.except(:space_id); p.save, albo, w ramach rozrywki napisać samemu odpowiedzialną za to klasę, bazując np. na sqlu…
ActiveRecord::Base.connection.execute("UPDATE projects SET context = delete(context, 'space_id') WHERE id = 41")
Aplikacja stoi na railsach 4.0 czy w takim przypadku dalej ma sens używanie https://github.com/diogob/activerecord-postgres-hstore ?