首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指定表名mid应用程序Ruby-Datamapper

指定表名mid应用程序Ruby-Datamapper
EN

Stack Overflow用户
提问于 2012-08-28 08:44:49
回答 2查看 370关注 0票数 0

我想使用Datamapper动态创建和查询表。

虽然Datamapper允许您使用遗留的表和模式,并以这种方式设置所使用的表名,但这只是在初始化期间进行的,而不是在应用程序内。

有没有一种简单的方法来告诉Datamapper在应用程序中迁移/升级具有指定表名的模型,然后告诉它查询这个表?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-04 08:50:23

最简单的不改变任何东西的方法是使用单独的数据库而不是表(假设任何关系也将存储在单独的数据库中),并打开到块中的附加存储库的连接。

代码语言:javascript
复制
DataMapper.setup(:external, "adapter://username:password@hostname/dbname")
DataMapper.repository(:external) do...end
票数 0
EN

Stack Overflow用户

发布于 2012-09-03 10:53:34

这应该不是问题。

所有的Ruby类都可以在运行时创建和重新定义。甚至初始化都是在运行时进行的。初始化恰好是在其他代码执行之前首先执行的。

这就是为什么猴子补丁如此容易工作的原因。它只是在初始化时的额外代码,只是重新定义类来添加额外的方法、变量等。

没有Ruby代码是“特殊的”,因为它只在编译时运行。Ruby是一种解释的语言。

要动态创建类,请参阅Dynamically creating class in Ruby

假设您不需要从字符串数组动态创建类,则可以使用define_method定义其他方法,或者在运行时调用Datamapper方法来添加属性。

要在类中定义新方法:

代码语言:javascript
复制
Post.send :define_method, :new_method_name do
end

要使用Datamapper属性定义新属性,请执行以下操作:

代码语言:javascript
复制
class Post
  include DataMapper::Resource
  property :title, String # the static way
end

Post.send :property, :title, String # add property the dynamic way (at run-time)

请注意,如果重新启动服务器,您在运行时定义的任何表或属性都将不可用,除非重新执行动态生成这些表或属性的代码。

要在运行时更新表,只需像平常一样执行相同的操作,即调用:

代码语言:javascript
复制
DataMapper.auto_upgrade!

要仅升级单个表,还可以执行以下操作:

代码语言:javascript
复制
Post.auto_upgrade!

第二个警告:如果您有多个进程,则需要在每个进程中运行动态代码,否则其他表模型和属性将不可用。

如果您有多个工作进程,这是一个问题,就像在生产中可能发生的那样(例如,具有多个独角兽工作者的Nginx,或在Ha_proxy后面的多个Mongrel工作者)。

如果您只有一个进程服务器,那么这不是问题。但是,如果您有多个工作进程,则必须运行动态代码以在每个进程中生成这些额外的类和属性,以使其可用。

这实际上与初始化是相同的,因为每个进程都会经历初始化(或者,如果是forked,则继承任何初始化)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12151412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档