我应该使用 YAML 文件还是数据库将我的 success/error 消息存储在 Rails 应用程序中?
Should I use an YAML file or the DB to store my success/error messages in Rails app?
在我的 Rails 应用程序中,在执行一些代码后,我想向用户发送 Slack 消息以通知他们执行结果。我想为多个进程发送这些消息,简而言之,我需要在某个地方存储 successes/errors 的消息模板(它们只是短字符串,如 "Hi, we've successfully done x!",但每个进程都不同过程)。
现在,我在数据库中有一个 SlackMessage
模型,您可以从中检索消息内容。但是,我听说最好在 yml
文件中管理这样的自定义消息,因为以后 add/edit 消息更容易(例如 this,尽管这是针对语言环境的) .
这种情况的最佳做法是什么?如果不使用数据库,我很感激你能否就如何操作给出指示或 link(就使用 yml
文件而言,我能找到的唯一 material 是internationalisation).
YAML 从中加载数据通常比数据库慢得多。此外,即使 YAML 流中有多个文档,YAML 解析器通常也会加载所有数据。
对于 run-time 较长且使用大部分消息的程序,使用 YAML 通常不是问题。但在简短的 运行 程序中,加载可能是 run-time 的重要组成部分,延迟加载和缓存等技术可能无济于事。举个例子:前段时间我的 YAML 库得到了一个 PR,它延迟了库中正则表达式的实例化,因为它延迟了一些程序的启动。
如果您有很多消息,它们在从 YAML 加载后都保留在内存中,这可能是个问题。对于数据库,更常见的是只检索需要的内容,并依靠数据库高效地执行此操作(缓存等)。
如果上面提到的优势和标准不能帮助您做出决定,您也可以两全其美:通过 YAML 和 的 reading/editing 的便利性数据库的速度、缓存等。 "Just" 将 YAML 流转换为数据库,可以在编辑 YAML 文档后显式地转换,也可以在您的程序首次使用时(通过查看文件 date-time-stamps)。这是像 postfix
这样的程序依赖于 postmap
的方法(尽管输入是文本,但不是 YAML 文件)。
为什么不使用 Rails 中已经存在的 I18n
模块?这非常适合存储消息,并使您能够在将来需要翻译时使用它们。
获取消息很简单:
Slack.message(I18n.t(:slack_message, scope:'slack'))
在这种情况下,您需要这样的翻译文件:
en:
slack:
slack_message: This is the message you are going to select.
阅读有关 I18n 的更多信息:https://guides.rubyonrails.org/i18n.html
在我的 Rails 应用程序中,在执行一些代码后,我想向用户发送 Slack 消息以通知他们执行结果。我想为多个进程发送这些消息,简而言之,我需要在某个地方存储 successes/errors 的消息模板(它们只是短字符串,如 "Hi, we've successfully done x!",但每个进程都不同过程)。
现在,我在数据库中有一个 SlackMessage
模型,您可以从中检索消息内容。但是,我听说最好在 yml
文件中管理这样的自定义消息,因为以后 add/edit 消息更容易(例如 this,尽管这是针对语言环境的) .
这种情况的最佳做法是什么?如果不使用数据库,我很感激你能否就如何操作给出指示或 link(就使用 yml
文件而言,我能找到的唯一 material 是internationalisation).
YAML 从中加载数据通常比数据库慢得多。此外,即使 YAML 流中有多个文档,YAML 解析器通常也会加载所有数据。
对于 run-time 较长且使用大部分消息的程序,使用 YAML 通常不是问题。但在简短的 运行 程序中,加载可能是 run-time 的重要组成部分,延迟加载和缓存等技术可能无济于事。举个例子:前段时间我的 YAML 库得到了一个 PR,它延迟了库中正则表达式的实例化,因为它延迟了一些程序的启动。
如果您有很多消息,它们在从 YAML 加载后都保留在内存中,这可能是个问题。对于数据库,更常见的是只检索需要的内容,并依靠数据库高效地执行此操作(缓存等)。
如果上面提到的优势和标准不能帮助您做出决定,您也可以两全其美:通过 YAML 和 的 reading/editing 的便利性数据库的速度、缓存等。 "Just" 将 YAML 流转换为数据库,可以在编辑 YAML 文档后显式地转换,也可以在您的程序首次使用时(通过查看文件 date-time-stamps)。这是像 postfix
这样的程序依赖于 postmap
的方法(尽管输入是文本,但不是 YAML 文件)。
为什么不使用 Rails 中已经存在的 I18n
模块?这非常适合存储消息,并使您能够在将来需要翻译时使用它们。
获取消息很简单:
Slack.message(I18n.t(:slack_message, scope:'slack'))
在这种情况下,您需要这样的翻译文件:
en:
slack:
slack_message: This is the message you are going to select.
阅读有关 I18n 的更多信息:https://guides.rubyonrails.org/i18n.html