2011-11-12 62 views
5

我不知道到底是什么,我应该命名这个问题。我刚开始进行服务器端编程,我需要一些帮助。动态创建新的Active Record模型和数据库表

所有我曾与创建预先定义的表,并与至今读RoR的交易教程预先定义字段(ID,姓名,电子邮件,等等等等)。他们使用ActiveRecord作为基类,保存到数据库由超类自动处理。

我试图编程的东西,允许用户定义表与字段。所以想想这个。 Web UI将有一个空表,用户将命名表并添加列(字段),然后添加行,然后保存它。我将如何实现这一点?我不是在要求细节,只是对它的概述。正如我所说的,到目前为止,我所阅读的所有教程都处理预定义的表格,其中预定义了ActiveRecord子类。

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

希望我是清楚的,如果不是,请让我知道,我会尝试更详细地说明了一下。 谢谢。

+3

如果你刚刚开始使用服务器端网页编程,那么从Hello World开始吧? :)从你的问题看来,你想用一大堆元编程来构建一个网页控制的数据库。我建议逐步采取措施。我可以在某种程度上想象你想要做什么,只是在“刚开始服务器端编程说话”中解释它。我的意思是最好的方式。雅? –

+1

让临时用户成为您的数据库设计师是一项高风险,高风险的业务。 –

+1

你试图做的事情实际上是非常先进的,即使那时基本上是一个糟糕的主意(但对新手实际上很常见!)。系统的用户应该存储数据。让他们创建表只是一个坏方法和一个坏主意,除非你有大量的dbms经验。模式创建者(在这种情况下)只需要创建灵活的数据结构,以存储您需要的任何内容。忘记用户创建表格的方法。毕竟他们会创建索引呢?他们理解独特吗?他们理解联结吗?复合键? yuch。 –

回答

2

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

举例来说,如果你想搜寻整个用户的表100一定值时,你必须跑100个单独的查询。该网站将创建更多的用户表指数更慢。

一个更理智的方式来做到这一点可能是有一个表模型这样

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

每个表格都必须连接到它的字段和行存储相应的数据(这会以某种方式编码)。

然而,随着@Aditya正确地指出,这是不是真的初学者的东西!

+1

这是“内心平台”的反模式。您正在使用现有的数据库平台创建“内部”数据库,该数据库平台性能不佳,难以理解,然后只是创建和修改实际表。对他来说,更好地动态地改变应用程序中单独的数据库或模式的模式,当然还有某些安全预防措施。我同意这当然不是初学者的东西。 – fregas

1

我同意前面的答案一般来说。从你的问题中不清楚为什么你想在运行时创建一个表。这么做的好处并不明显。如果您只是试图存储似乎适合于具有行和列的表的数据,为什么不将它作为数组存储在用户表的字段中。如果您允许用户创建许多表,那么你可以有类似

class User < ActiveRecord::Base 
    has_many :tables 
    end 

,然后每个表可能有一个字段来存储序列化数组。或者你可以去Alex的建议 - 最好的选择实际上取决于你要去的数据,它是如何经常改变做什么,无论你需要搜索它等等...

1

您可以创建一个数据库如教程中所示,这些教程中存储了用户所需的表名和列名。然后你可以让工作人员(可以使用Redis和Resque构建,here在Resque和Redis上很简单),并让那些工作人员在DB中为新表运行迁移(用变量编写迁移并使用参数替换它们)尽快在数据库中创建新条目。告诉我你是否对此有疑问。

+1

他刚刚开始。 “可以使用Redis和Resque构建”是非常棒的。 –

相关问题