【问题标题】:Storing Ruby code in the database在数据库中存储 Ruby 代码
【发布时间】:2012-05-02 17:11:42
【问题描述】:

我的 Ruby on Rails 应用程序需要根据数据库记录生成报告 我一直在数据库中存储生成这些报告所需的 SQL 和 ERB 代码。每份报告由三部分组成:

  • 一个标头,它是一个 ERB sn-p,使用 <%= render inline: @report.header %> 呈现
  • 页脚,它是另一个 ERB sn-p,使用 <%= render inline: @report.footer %> 呈现

然后使用 @rows = eval("#{@report.model}.find_by_sql('#{@report.query}')") 评估其内容的主体,使用以下方式呈现:

<% @rows.each do |row| %>
  <tr>
    <% row.attributes.each_value do |value| %>
      <td><%= value %></td>
    <% end %>
  </tr>
<% end %>

@report.model 中的模型是存储在列中的 Ruby 类的名称。

虽然这可以很好地完成工作,但我开始对在数据库中存储实际源代码感到不安。已提出的替代方法是将代码存储在文件中,而不是将代码存储在数据库中,并从数据库中引用这些文件。对我来说,这听起来并没有好多少(事实上,这更麻烦,因为我必须打开并读取文件,而不是简单地呈现数据库列中的文本)。

在数据库中存储这样的源代码的普遍共识是什么,以及有哪些(更好的)替代方案:一些考虑因素包括:

  • 很少添加新数据(我们所说的报告基于自 1999 年以来未更改的联邦法规)
  • 如果确实需要更改,除我之外的任何人都不会对其进行修改(虽然我显然无法预测未来,但为了争论,我们假设这是正确的)。
  • 记录数有限。我们在这里最多讨论八种不同的报告。

【问题讨论】:

  • 如果它很少改变并且只会由你(程序员)改变,你为什么首先需要这种动态方法?为什么不为每个报告设置不同的视图/控制器/whatnot?
  • 你好安德鲁。好点子。老实说,我从未考虑过简单地对不同的报告进行硬编码。我想那是完全可能的。但是,另一方面,如果确实需要更改报告,我更愿意进入数据库而不是更改我的应用程序并重新部署。对我来说,这似乎是一个风险较小的手术。

标签: sql ruby-on-rails database erb


【解决方案1】:

我在数据库中存储代码没有问题,但我确实想知道,如果它很少被添加,并且你是唯一一个更改它的人,那么这样做你真正获得了什么(将其保存在数据库中)。我有点怀疑它是否值得,除非它需要经常改变。 OTOH,IMO,只要对您的应用程序的其余部分进行相同的测试,这样做并没有什么坏处。

数据库中的模板——这也没有问题,尽管同样的警告也适用。请注意,特别是在 Rails 3+ 中,您可以扩展 Rails 以自动从数据库中检索模板,从而可能为您节省一些手动工作。

我不知道是否有任何其他很棒的替代方案,但如果您担心重新部署,我可能会考虑上传文件而不是 DB blob。

【讨论】:

  • 嗨,戴夫。像安德鲁一样,好点。正如我在他的回复中详细说明的那样,我更愿意进入数据库来更改它,而不是更改我的应用程序并重新部署。我很高兴听到这不是令人不悦的事情,也没有其他很好的选择,并且会继续沿着这条路走下去。谢谢!
猜你喜欢
  • 2013-10-04
  • 2011-01-31
  • 2013-08-27
  • 2011-04-26
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多