Bir model sayacını atomik olarak artırmalı ve yeni değerini (bir Sidekiq işi tarafından işlenmiş) kullanmalıyım. Şu anda Rails ve Postgres ile atomik sayacın değerini (artış) alın
, ben sayacı atomik artırır benim modelindeGroup.increment_counter :tasks_count, @task.id
kullanın.
Ama Ayrıca sayaç varsa, bir bildirim göndermek için yeni değerine de ihtiyacım var. 50
değeri. Herhangi bir fikir? Tabloyu/satırı kilitlemek veya daha kolay bir yolu var mı?
Düzenleme/ÇÖZÜM mu dayanarak
'cevabı ve raylar en update_counters
yöntem olup, I (PostgreSQL ile test edilmiştir) bir örnek yöntemi uygulamaya çok kısadır.
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
hoşuna kullanın:
Group.increment_counter_and_return_value(:tasks_count, @task.id)
Aynı sorgu içinde yeni değeri getirmesi RETURNING
kullanır.
Bana bunu gösterdiğiniz için teşekkür ederiz. Sorumu, cevabınıza dayalı bir örnek yöntemiyle güncelledim. – tbuehl