Rails 3 ActiveRecord .skip_callback 线程安全

2024-04-03

这段代码线程安全吗?

MyModel.skip_callback(:save, :before, :my_callback)
my_model_instance.update_attributes(attributes)
MyModel.set_callback(:save, :before, :my_callback)

我可以安全地使用它来避免递归地重新触发相同的回调吗?

这是一个例子

class Blog < ActiveRecord::Base

  after_save  :update_blog_theme, :if => :active_theme_id_changed?

  # ...

  private

  def update_blog_theme

    # Reuses a previously used BlogTheme or creates a new one
    blog_theme = BlogTheme.find_by_theme_id_and_blog_id(
                      self.active_theme_id, 
                      self.id)

    blog_theme ||= BlogTheme.create!( 
                     :theme_id => active_theme_id, 
                     :blog_id => self.id )

    Blog.skip_callback(:save, :after, :update_blog_theme)
    self.update_attributes!(:active_blog_theme_id => blog_theme.id) 
    Blog.set_callback(:save, :after, :update_blog_theme)

  end

end

skip_callback and set_callback不是线程安全的。我在尝试在 sidekiq(线程异步作业处理器)中创建一些记录时能够确认这一点。一旦我重新启用回调,就会出现竞争条件,导致回调被调用。如果我评论回调重新激活代码,就没有问题。

我找到了许多可能的解决方案,其中包括两个要点:

  • “偷偷保存”的宝石
  • 'skip_activerecord_callbacks' 宝石

偷偷摸摸的保存宝石似乎是这里最直接、最能暴露意图的选择。 gem 本质上绕过了 ActiveRecord 持久性方法并直接执行 sql。

这也是我唯一可以自信地说是线程安全的。它也是一个非常小且易于理解的宝石。缺点是它不调用验证。因此,您需要自己调用验证。

阿南德·A·贝特 (Anand A. Bait) 总结了一些选项。我怀疑所有五个选项都是线程安全的。上面提到的两种宝石与其他宝石一起列出possibleAnand 帖子中的选项:http://www.allerin.com/blog/save-an-object-skipping-callbacks-in-rails-3-application/ http://www.allerin.com/blog/save-an-object-skipping-callbacks-in-rails-3-application/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails 3 ActiveRecord .skip_callback 线程安全 的相关文章

  • Rails 3 + angularjs + 缩小在生产中不起作用:未知提供者:eProvider

    我已遵循我能找到的所有修复缩小的说明 例如 var MyController function renamed scope renamedGreeter MyController inject scope greeter and someM
  • Rails 4:资产未在生产中加载

    我正在尝试将我的应用程序投入生产 但图像和 CSS 资源路径不起作用 这是我目前正在做的事情 图像资源位于 app assets images image jpg 样式表位于 app assets stylesheets style css
  • 如何从引擎覆盖 Rails 应用程序路由?

    我有一个 Rails 应用程序 我正在尝试将 Rails 引擎集成到其中 主机应用程序有一些捕获所有路由 magic urls match gt admin rendering show match path edit gt admin r
  • Rails 3 在 Ruby 1.9.2 上初始化非常慢

    我使用 RVM 来管理环境 安装了 Ruby 1 9 2 p136 我认为是最新版本 和 Rails 3 创建了 gemset 并运行捆绑器 到目前为止一切正常 但 Rails 在运行命令 即生成 销毁 rake 等 时初始化速度非常慢 完
  • 仅删除多对多关系

    我有一个 has and belongs to many friends join table gt friends peoples 要添加朋友 我会这样做 people followers lt lt friend这会创建关系和新的个人资
  • Ruby on Rails:如何使用 TCP 套接字连接 GPS 设备

    ruby 2 3 0p0 2015 12 25 修订版 53290 x86 64 linux 轨道 4 2 4 我正在使用 cloud9 IDE 和 webrick 服务器 我的项目是实时跟踪GPS 我想使用TCP连接与GPS跟踪设备进行通
  • 为什么 RackMultipart* 文件保留在我的 Rails /tmp 目录中?

    我正在使用 Paperclip 2 3 来处理在 Ubuntu 上运行的 Rails 3 0 3 应用程序上的图像上传 Paperclip 正在按广告处理上传 但在应用程序的 tmp 文件夹中创建的 RackMultipart 文件仍然存在
  • rvm gem 安装错误?

    我正在摆弄 ruby gems 和 rvm 它工作得很好 但现在当我尝试安装 gem 时出现错误 gem install Rails错误 同时 执行 gem Errno EACCES 权限被拒绝 Users da rvm gems ruby
  • Rails 4 应用程序...在开发环境中,除非刷新页面,否则 javascript 不会触发

    所以我的第一个rails4应用程序遇到了一个奇怪的问题 除非我重新加载页面 否则我的页面javascript不会触发 对于我的 asset pipeline JS 和 content for JS 来说都是如此 在我的 assets jav
  • 如何向 Rails 应用程序添加自定义字体?

    我想在 RoR 应用程序中使用几种字体 但它们的格式主要是 ttf 和 otf 等 我该如何将这些文件嵌入到我的 Rails 应用程序中 也就是说 一旦我将它们放入我的资产文件夹中 将它们嵌入我的 CSS 和 或 LESS 文件中的语法到底
  • Ruby/Rails 集合到集合

    我有两个表与一个连接表连接 这只是伪代码 Library Book LibraryBooks 我需要做的是 如果我有一个图书馆的 id 我想获取该图书馆拥有的所有书籍所在的所有图书馆 因此 如果我有图书馆 1 图书馆 1 中有书籍 A 和
  • 如何在 Ruby 2.2 上删除不安全密码来强化 Rails+webrick+https

    更新 首先 我的测试代码没有充分显示 ruby 2 4 看到 SSLCiphers 选项 而 ruby 2 2 没有 我编辑了下面的示例代码以清楚地表明这一点 更新 由于我的问题未能得到社区的任何帮助 我继续前进 两天后找到了解决方案 我将
  • 如何使信号量超时

    Go 中的信号量是通过通道来实现的 一个例子是这样的 https sites google com site gopatterns concurrency semaphores https sites google com site gop
  • Shoulda/RSpec 匹配器 - 条件验证

    在我的代码中 我使用 Shoulda 匹配器进行了以下验证 效果很好 it should validate presence of name 在我的模型中 我已将条件添加到验证中 validates presence of name if
  • Rails 资源单数还是复数?

    我有一条搜索路线 我想将其设为单数 但是当我指定单数路线时 它仍然会生成复数控制器路线 这是应该的样子吗 resource search Gives me search POST search format action gt create
  • 如何在 Capybara 中 POST 到 URL?

    刚刚从 Cucumber Webrat 切换到 Cucumber Capybara 我想知道如何将内容 POST 到 Capybara 中的 URL 在 Cucumber Webrat 中我能够执行以下步骤 When I send to d
  • 检测 Google 验证码的挑战窗口何时关闭

    我正在使用谷歌隐形验证码 有没有办法检测挑战窗口何时关闭 我所说的挑战窗口是指您必须选择一些图像进行验证的窗口 目前 我在按钮上放置了一个旋转器 一旦单击按钮 就会呈现验证码挑战 无法向用户提示另一个质询窗口 我以编程方式调用渲染函数 gr
  • Heroku Rails 应用程序级别不记录日志

    我在 Heroku 上有一个 Rails 应用程序 它没有在应用程序级别进行日志记录 当前版本 红宝石1 9 3 导轨3 1 3 在 config environment development rb 中有以下几行 config logge
  • 在 Sinatra 中运行后台进程

    我有 Sinatra Rails 应用程序和一个启动一些漫长过程的操作 通常我会为后台作业排队 但这种情况太简单了 后台进程很少启动 所以队列是一个开销 那么如何在没有队列的情况下运行后台进程呢 get build logs project
  • 仅针对 Rake 任务运行初始化程序

    我希望在执行 Rake 任务时运行某个初始化程序 但在运行 Rails 服务器时不运行 区分 Rake 调用和服务器调用的最佳方法是什么 Rake 允许您指定任务的依赖关系 最好的建议操作是将特定于 rake 的初始化放入其自己的任务中 而

随机推荐

  • 如何获取 Nodejs 中显示的 console.log 行号?

    有一个旧的应用程序 它使用以下命令打印出大量消息console log 但我就是找不到哪些文件和行console log叫做 有没有办法连接到应用程序并显示文件名和行号 每个调用都有完整的堆栈跟踪有点吵 我刚刚改进了 noppa 的解决方案
  • 如何使用php传递和访问数组变量

    我有一个数组 param 在给出 Print r 时 输出如下 Array pattern gt status gt Array 0 gt 0 1 gt 4 我必须将状态值传递给一个函数 例如 function value action p
  • 如何使用ggplot2从geom_tile(热图)中删除白线

    我无法去除热图中图块之间的白线 下面是我的代码和图片 以前有人遇到过这种情况吗 t lt ggplot Drug heatmap df final aes x reorder Drug Total Deaths y Start Date f
  • 分配内存的嵌套结构

    gcc c89 我在这一行得到堆栈转储 strcpy comp gt persons gt name Joe 但是 我已经分配了内存 所以不确定为什么我会得到它 我在这里错过了什么吗 非常感谢您的任何建议 include
  • 将 WooCommerce 订单项自定义字段总和保存为新元数据

    当在此 WooCommerce 商店中订购特定产品时 两个元值将添加到订单中 存储元值的两个字段位于wp woocommerce order itemmeta 元键是 quantity assemblycost 我想在下新订单时以编程方式创
  • 从字符串 Django 模板中删除第一个字符

    我知道这个问题已经被问过多次 但每个人都达到的解决方案 和文档 似乎并不适合我 尝试删除第一个字符 Code is picture picture path slice 1 但结果仍然是 DOF mrD5T49 jpg 试图获得前导点 我是
  • ActiveMQ:如何以编程方式监控嵌入式代理

    我想从代码内部监控嵌入式 ActiveMQ 5 8 代理 如何才能做到这一点 我需要 JMX 连接吗 我想防止暴露 JMX 有没有办法访问org apache activemq broker jmx http activemq apache
  • 在一个请求中创建多个项目的 RESTful 方式

    我正在开发一个小型客户端服务器程序来收集订单 我想以 REST ful 方式 来做到这一点 我想做的是 收集所有订单行 产品和数量 并将完整订单发送到服务器 目前我看到有两种选择可以做到这一点 将每个订单行发送到服务器 POST qty 和
  • 在 AngularJS 中使用逗号作为列表分隔符

    我需要创建一个以逗号分隔的项目列表 li b email last b li 根据 AngularJS 文档 表达式中不允许使用控制流语句 这就是为什么我的 last 不起作用 是否有其他方法来创建逗号分隔的列表 EDIT 1有没有比以下更
  • SQLite 并插入 UTC 格式的当前日期

    如何在 sqlite 数据库上使用 SQL 语句插入 UTC 格式的当前日期 我找到了NOW函数 但它的格式是什么 这将在移动设备上进行 因此每个人都会有不同的区域设置 但是 我需要标准时间格式 因为设备会将日期与我的服务器进行比较 另外
  • Python - DM 用户 Discord 机器人

    我正在 Python 中开发一个 User Discord 机器人 如果机器人所有者输入 DM user然后机器人会私信所有者提到的用户 client event async def on message message if messag
  • 是否可以在同一个 html 页面中多次使用相对位置?

    我在主页上使用 相对位置 和 绝对位置 我有一个使用上述母版页的页面 并且我尝试在此页面中再次对其他 2 个元素使用 相对位置 和 绝对位置 但该页面中下面的元素 绝对位置 是不是根据其上方的元素放置的 相对位置 而是指母版页中元素的 相对
  • 如何在 JavaFX 中将 GUI 覆盖到 3D 场景上?

    我在 JavaFX 中有一个 3D 场景 需要在 3D 场景上覆盖 GUI 我尝试向场景添加按钮和文本 但它们始终作为 3D 对象出现在 3D 视图中 我环顾四周 没有找到该怎么做 唯一的解决方法是创建一个全新的窗口并将设置放在那里 但在这
  • Android Facebook - 获取空个人资料

    第一次使用 Facebook SDK 我无法获取用户个人资料 它始终为空 怎么了 btnFbWidget LoginButton findViewById R id btnFbWidget btnFbWidget setReadPermis
  • 删除indexedDB对象存储中特定索引值的所有记录

    对于数组键为的对象存储 a b where a也是一个索引 有没有更有效的方法来删除特定值的所有记录a而不是在索引上打开游标a并通过光标逐步删除每条记录 有没有办法只为索引定义键范围 或者只为索引定义键范围a然后离开b打开任何值 以便可以删
  • 如何在 AngularJS 和 Jasmine 中对 $http 进行单元测试

    这是我的代码 因为代码很长 所以我做了一个 Plunker describe create function it Should be defined function expect BaseService create toBeDefin
  • 导入特定于版本的 python 模块的最佳方法

    对于在特定于版本的 python 中导入模块 哪种方法最有意义 我的用例是 我正在编写将部署到 python 2 3 环境中的代码 并在几个月内升级到 python 2 5 这 if sys version info 2 gt 2 5 fr
  • 复制到剪贴板需要花费大量时间

    我有以下代码将 25MB 的数据复制到剪贴板 star time after populating HTML and Text const start time new Date getTime navigator clipboard wr
  • Applescript 将启动 Chrome(具体内容)

    我真的很难创建一些在 osx 上启动浏览器窗口 chrome 的方法 具体细节包括窗口大小 没有选项卡等 传统上 我通过带有 IE 的窗口使用 vb 脚本 这是一个非常简单的练习 但我 我将是第一个承认的人 当谈到 Mac 时 我感到非常挣
  • Rails 3 ActiveRecord .skip_callback 线程安全

    这段代码线程安全吗 MyModel skip callback save before my callback my model instance update attributes attributes MyModel set callb