Ruby中的Code-First等价物

3

我非常懒惰,不喜欢制作迁移。我想先创建我将要使用的模型,然后让其他工具为我在ruby中找出迁移,因为.Net已经宠坏了我。有没有一种gem可以从模型中获取活动记录迁移?即使在ruby中你从未明确设置类型,这也可能吗?


1
这不是 Rails 的方式。如果你违背了 Rails,你将会遭受痛苦的折磨。你已经被警告了。 :) - Sergio Tulentsev
不会发生 - 正如您所提到的,列类型检测是主要问题。将迁移视为您需要指定模型属性“类型”的唯一位置,您会发现您没有错过太多... - PinnyM
呃,我会为了一些愚蠢的个人项目混合使用各种东西。我现在正在使用sinatra和active-record...我并不害怕!=) - Justin
4个回答

4
您可以使用DataMapper代替ActiveRecord。
来自DataMapper文档的示例代码:
require 'rubygems'
require 'dm-core'
require 'dm-migrations'

DataMapper::Logger.new($stdout, :debug)
DataMapper.setup(:default, 'mysql://localhost/test')

class Person
  include DataMapper::Resource
  property :id,   Serial
  property :name, String, :required => true
end

DataMapper.auto_migrate!

这太完美了。谢谢!顺便问一下,DataMapper.auto_upgrade! 会从一开始就起作用吗?还是我需要先使用 DataMapper.auto_migrate!? - Justin

2

这没有任何意义。你的模型从架构中提取数据结构,而不包含列/表定义。无法从模型“推送”表结构到迁移中,这是不可能的。数据就是不存在的。

按照现有写法,这个模型可能会持续存在一个拥有一千列或一个列的表中,我们无从得知:

class User < ActiveRecord::Base

end

只需使用Rails生成器即可同时生成模型和迁移。


理论上,它们可以通过rake任务从attr_accessible和associations中提取 - 尽管这并不总是准确的。但是,Code First迁移也并不总是准确的... - PinnyM
同意 - 因为缺少类型信息,正如我之前所评论的。 - PinnyM
@Justin,这里的关键是你是否能够检测到所需的列。ActiveRecord在模型中不需要任何提及它们。我只是指出通常会有一些参考(在某些情况下是间接的),尽管不能保证。无论如何,由于类型的原因,整个问题都没有意义。 - PinnyM
@PinnyM 我甚至不在乎是否使用active-record,我只是在寻找Ruby中的Entity Framework Code First等效物。也许我不应该用ruby-active-record标记这个问题 =\ - Justin
@Justin 不是类型的问题,不要再谈论类型了。你的模型可能会持久化到一个甚至不信任数据类型的文档存储中!问题在于整个列在模型中没有任何参考。我的上面的例子非常清楚。我的User模型,按照书写方式,是一个完全有效的模型,根据模型定义无法获取有关其列的任何信息。 - user229044
显示剩余11条评论

1

由于 Ruby 没有明确地设置类型,

此外,在模型中你甚至不需要列出字段。ActiveRecord 会从数据库架构中发现它们,这是架构知识库。它就是这样工作的。试图让它以另一种方式工作将造成巨大的痛苦和沮丧。


0

如果你正在使用遗留数据库,你不需要迁移,也不想要它们。如果你试图使用迁移工具,你的数据库管理员可能会杀了你。

话虽如此,我已经使用 Sequel 反向工程了遗留数据库,为我们内部使用的工具创建了模型,这些工具没有提供数据库布局。

作为其中的一部分,我通过 Sequel 访问模式,并获取字段名称、数据类型和大小。这就是你需要重建迁移所需的信息。

这不是一个万能的解决方案。你需要停止“超级懒”和“愚蠢”的行为,并编写代码来完成这个过程,但这是完全可行的。

手动转储模式,并编写代码来挑选出重要信息,并将其写入单个迁移文件中,以启动你的系统。


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