动态创建新的Active Record模型和数据库表

时间:2011-11-12 05:11:47

标签: ruby-on-rails ruby database

我不确定我应该为这个问题命名。我刚开始服务器端编程,我需要一些帮助。

我目前在RoR上阅读的所有教程都涉及创建预定义表和预定义字段(id,name,email等等) )。它们使用ActiveRecord作为基类,并且保存到db由超类自动处理。

我正在尝试编写的内容允许用户定义的表包含字段。所以想想这样的方式。 Web UI将有一个空表,用户将命名表,并添加列(字段),然后添加行,然后保存它。我该如何实现?我不是要求细节,只是概述它。正如我所说,到目前为止我读过的所有教程都处理预定义的表,其中包含预定义ActiveRecord子类的字段。

简而言之,我要问的是,如何在运行时的db中创建表,并向表中添加字段。

希望我很清楚,如果没有,请告诉我,我会再详细说明一下。 感谢。

3 个答案:

答案 0 :(得分:2)

除非您正在构建数据库管理工具(甚至可能是这样),否则允许用户以您建议的方式直接访问数据库层可能是一个坏主意。除了稳定性和安全性问题之外,如果用户创建了大量表格,它会变得非常慢。

例如,如果要在100个用户的表中搜索特定值,则必须运行100个单独的查询。创建的用户表越多,该站点的指数就越小。

更实用的方法可能是拥有像这样的Table模型

class Table < ActiveRecord::Base
  has_many :fields
  has_many :rows
end

每个表都附加了字段,以及存储相应数据的行(以某种方式编码)。

然而,正如@Aditya正确指出的那样,这不是真正的初学者!

答案 1 :(得分:1)

我同意以前的答案。从您的问题为什么您想要在运行时创建表格并不清楚。这样做的好处并不明显。如果您只是尝试存储似乎适合包含行和列的表的数据,为什么不将它作为数组存储在用户表的字段中。如果允许您的用户创建许多表,那么您可以使用

class User < ActiveRecord::Base
     has_many :tables
  end

然后每个表可能有一个字段来存储序列化数组。或者你可以选择亚历克斯的建议 - 最好的选择实际上取决于你将如何处理数据,改变的频率,是否需要搜索等等......

答案 2 :(得分:1)

您可以创建一个数据库,如教程中所示,它存储表的名称及其列名称,指定用户想要的名称。然后你可以让worker(可以使用Redis和Resque构建,here是简单的Tut on Resque和Redis)并让这些worker运行迁移(使用变量编写迁移并使用params来替换它们)只要在数据库中创建了新条目,就会在DB中创建表。如果您对此有疑问,请告诉我。