gpt4 book ai didi

ruby-on-rails - ActiveRecord/Rails 中的原子插入或增量

转载 作者:行者123 更新时间:2023-12-03 00:52:14 25 4
gpt4 key购买 nike

在 Rails 中为带有计数器的模型实现原子插入/更新的最佳方法是什么?对于我试图解决的问题,一个很好的类比是带有两个字段的“like”计数器:

url   : string
count : integer

插入时,如果当前没有匹配 url 的记录,则应创建一条新记录,计数为 1;否则现有记录的 count 字段应增加。

最初我尝试了如下代码:

Like.find_or_create_by_url("http://example.com").increment!(:count)

但毫不奇怪,生成的 SQL 显示 SELECT 发生在 UPDATE 事务之外:

Like Load (0.4ms)  SELECT `likes`.* FROM `likes` WHERE `likes`.`url` = 'http://example.com' LIMIT 1
(0.1ms) BEGIN
(0.2ms) UPDATE `likes` SET `count` = 4, `updated_at` = '2013-01-17 19:41:22' WHERE `likes`.`id` = 2
(1.6ms) COMMIT

是否有 Rails 习惯用法来处理这个问题,或者我是否需要在 SQL 级别实现它(从而失去一些可移植性)?

最佳答案

您可以使用pessimistic locking ,

like = Like.find_or_create_by_url("http://example.com")
like.with_lock do
like.increment!(:count)
end

关于ruby-on-rails - ActiveRecord/Rails 中的原子插入或增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14387022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com