Ho bisogno di incrementare atomicamente un contatore del modello e utilizzare il suo nuovo valore (elaborato da un lavoro Sidekiq).Ottieni il valore del contatore atomico (incremento) con Rails and Postgres
Al momento, io uso
Group.increment_counter :tasks_count, @task.id
nel mio modello che incrementa atomicamente il contatore.
Ma Ho anche bisogno del suo nuovo valore per inviare una notifica, se il contatore ha per es. il valore 50
. Qualche idea? Chiudendo il tavolo/la fila o c'è un modo più semplice?
Modifica/SOLUZIONE
Sulla base mu è troppo breve 's risposta e il metodo update_counters
di Rails, ho implementato un metodo di istanza (testato con PostgreSQL).
def self.increment_counter_and_return_value(counter_name, id)
quoted_column = connection.quote_column_name(counter_name)
quoted_table = connection.quote_table_name(table_name)
quoted_primary_key = connection.quote_column_name(primary_key)
quoted_primary_key_value = connection.quote(id)
sql = "UPDATE #{quoted_table} SET #{quoted_column} = COALESCE(#{quoted_column}, 0) + 1 WHERE #{quoted_table}.#{quoted_primary_key} = #{quoted_primary_key_value} RETURNING #{quoted_column}"
connection.select_value(sql).to_i
end
utilizzarlo come:
Group.increment_counter_and_return_value(:tasks_count, @task.id)
utilizza RETURNING
per andare a prendere il nuovo valore all'interno della stessa query.
Grazie per avermi a questo. Ho aggiornato la mia domanda con un metodo di istanza basato sulla tua risposta. – tbuehl