> On Mar 3, 2018, at 3:47 PM, Jonathan Rochkind <jonat...@dnil.net> wrote: > > It is now easy to store a hash serialized as jsonb in posgres. It is even > pretty easy with store_accessor to make individual keys in the hash look like > separate attributes. > > But when AR decides the jsonb column needs to be updated, it will send the > entire hash as an update value. If you only changed a key or two, it will > still send the entire hash -- possibly overwriting changes to other keys made > by other processes/clients. > > Recent versions of postgres supports an atomic update on just certain keys of > a jsonb hash, using `jsonb_set` in SQL. > > I'd like to explore trying to get AR to do this, at first with a plugin. > With dirty tracking, it's fairly straightforward for AR to figure out what > top-level keys have been changed and what haven't. > > But I can't quite figure out where to intervene in AR to change the SQL > generated in an 'update' operation. So I can generate different SQL that will > do an atomic update, where possible.
The most central spot would be in `_update_record`: https://github.com/rails/rails/blob/263f01d93da118dc150c6ac816e70dcf10de2608/activerecord/lib/active_record/persistence.rb#L195 <https://github.com/rails/rails/blob/263f01d93da118dc150c6ac816e70dcf10de2608/activerecord/lib/active_record/persistence.rb#L195> or in the related `_substitute_values` method. This could be too late to see things like dirty tracking, though - you may need to start searching up the call stack from `_update_record`. —Matt Jones > If anyone could give me any advice on where might work to hook into AR to > change generated SQL for 'update', I would appreciate it! And I hope to look > into making a plugin to let AR do specified-key-only updates to postgres > jsonb columns. Thank you for any advice! > > -- > You received this message because you are subscribed to the Google Groups > "Ruby on Rails: Core" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to rubyonrails-core+unsubscr...@googlegroups.com > <mailto:rubyonrails-core+unsubscr...@googlegroups.com>. > To post to this group, send email to rubyonrails-core@googlegroups.com > <mailto:rubyonrails-core@googlegroups.com>. > Visit this group at https://groups.google.com/group/rubyonrails-core > <https://groups.google.com/group/rubyonrails-core>. > For more options, visit https://groups.google.com/d/optout > <https://groups.google.com/d/optout>. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-core+unsubscr...@googlegroups.com. To post to this group, send email to rubyonrails-core@googlegroups.com. Visit this group at https://groups.google.com/group/rubyonrails-core. For more options, visit https://groups.google.com/d/optout.