在数据库中存储 Ruby 代码

4
我的Ruby on Rails应用程序需要基于数据库记录生成报表。我一直在数据库中存储生成这些报表所需的SQL和ERB代码。每个报表由三部分组成:
  • 一个头部,它是一个ERB片段,使用<%= render inline: @report.header %>进行呈现
  • 一个脚注,它是另一个ERB片段,使用<%= 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年以来没有变化的联邦法规的报告) - 如果确实需要更改,除了我之外永远不会被其他人修改(虽然我显然无法预测未来,但是让我们假设这是正确的) - 记录的数量是有限的。我们最多只涉及八个不同的报告。

4
如果它很少更改并且只能由您(程序员)更改,为什么您需要在第一时间采用如此动态的方法?为什么不为每个报告都拥有不同的视图/控制器/等等呢? - Andrew Marshall
嗨,安德鲁。说得好。老实说,我从未考虑过简单地硬编码不同的报告。我想那完全是可能的。然而,另一方面,如果需要更改报告,我更喜欢进入数据库而不是更改我的应用程序并重新部署。对我来说,这似乎是一种风险较小的操作。 - Laurens
1个回答

4
我并不反对将代码存储在数据库中,但我确实怀疑,如果它很少被添加,并且只有您一个人更改,那么将其保留在数据库中是否真的有所收益。除非这是经常需要更改的内容,否则我有点怀疑它是否值得。另一方面,在我看来,只要它遵循与应用程序其余部分相同的测试流程,这样做并没有什么害处。
将模板存储在数据库中-也没有问题,尽管同样的警告适用。请注意,特别是在Rails 3+中,您可以扩展Rails以自动从数据库中检索模板,从而可能为您节省一些手动工作。
我不知道是否有任何其他好的替代方案,但如果您担心重新部署的话,我可能会考虑上传文件而不是数据库 BLOB。

嗨,戴夫。像安德鲁一样,说得好。正如我在他的回复中所阐述的那样,我更喜欢进入数据库来进行更改,而不是更改我的应用程序并重新部署。我很高兴听到这不是被不赞成的事情或者有其他很好的替代方案,因此我将继续沿着这条路走。谢谢! - Laurens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接