【问题标题】:Update database when a file changed in public/ with rails [closed]当文件在公共/使用rails更改时更新数据库[关闭]
【发布时间】:2014-07-22 05:00:07
【问题描述】:

我希望能够在修改 public/ 中的文件时更新我的​​数据库。 Rails 应用程序使用旧系统推送的文件,我们需要根据这些更改更新内部数据库。

这可能吗?我该怎么做。我检查了警卫,但它可以在生产中使用吗?有更好的选择吗?也许我可以只使用 dnotify,但我想将项目中的所有内容都保留在 ruby​​ 中,并且不需要外部程序。

谢谢:P

【问题讨论】:

  • 我不知道你为什么问guard 是否可以在生产中使用。绝对是。对于“更好”的替代方案,重要的是要知道您认为什么是“更好”。
  • 在生产中可用我的意思是,它会泄漏内存,会破坏东西。我真的不知道守卫那么好。 :S 为了更好,我的意思是,人们一般用什么来做那种事情
  • 为什么不看看guard 的论坛,看看人们面临什么样的问题? stackoverflow.com/questions/tagged/guard。我个人会相信拥有近 500 万次下载量的 gem。另外,这让我觉得,你的问题并不是一个与编程相关的具体问题,而是与信任相关的。你应该在 Quora 上问它;-)
  • 如果您不确定在生产中使用它,我建议您坚持使用旧的 cron 和您编写的脚本。
  • 我看到的一切都是人们想要管理他们的资产并用它进行测试。在生产中没有这些。但无论如何,这不是重点。我只是想知道一种方法,我可以轻松地在文件更改时更新我的​​数据库。

标签: ruby-on-rails ruby guard watch


【解决方案1】:

Guard 使用了一个名为 listen 的 gem,它在下面实现了通用通知和与各种操作系统模块的接口。

听支持:

  • Linux 通过rb-inotify
  • 达尔文来自rb-fsevent
  • Windows 通过wdm(mingw,不是 cygwin)
  • BSD(排序)通过rb-kqueue
  • 每秒通过 Ruby 轮询文件系统是备用选项。

这些模块基本上都是薄单板,允许访问底层操作系统通知系统调用。如果您愿意,您可以直接编写操作系统特定模块之一,但是当有人已经给您一个通用接口时,您为什么还要呢?

Listen 使用起来相当简单:

listener = Listen.to('dir/path/to/listen') do |modified, added, removed|
   puts "mod: #{modified}" if modified
   puts "add: #{added}"    if added
   puts "rem: #{removed}"  if removed
end
listener.start

如果您对 FFI/C 模块有疑虑或问题,可以使用更长的轮询间隔

options = {
  force_polling: true,
  latency:       30 
}

然后使用daemons-rails 集成代码以与您的rails 应用程序一起运行

【讨论】:

  • 谢谢,它就像一个魅力
猜你喜欢
  • 2012-03-25
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
  • 2022-01-05
  • 2018-04-22
相关资源
最近更新 更多