使用datamapper从类中删除属性时删除数据库字段

时间:2012-02-19 00:10:24

标签: migration associations sinatra datamapper field

我在Sinatra应用程序中使用datamapper。我目前使用命令

DataMapper.finalize.auto_upgrade!

处理迁移。我有两个带有'has_n'和'belongs_to'关联的类(艺术家和事件)。事件'belowned_to'一个艺术家和一个艺术家可以有许多与之相关的事件。

我通过删除管理模型中原始one_to_many关联的类定义的前面部分并添加

,将关联更改为many_to_many关系
has n, :artists, :through => Resource

到Event类和Artist类的相应代码。当我创建一个新事件时,错误就会启动。

#<DataObjects::IntegrityError: events.artist_id may not be NULL

:artist_id字段是两个类之间原始关联的遗留物。 event.artists [i]访问新的many_to_many关联(其中'i'只是一个从0到关联艺术家数量-1的整数索引)。显然艺术家和活动类之间的原始关联方法仍然存在?我的猜测是解决这个问题的方法不仅是使用内置于datamapper中的auto_upgrade方法,而是编写显式迁移。如果有办法处理这种类型的数据库更改并仍然使用auto_upgrade方法,那就太棒了!

如果您需要有关我的模型或其他任何内容的更多详细信息,请询问,我很乐意添加它们。

2 个答案:

答案 0 :(得分:1)

根据我的经验,DataMapper的auto_upgrade不能很好地工作 - 或者,至少可以说,它不像我期望的那样工作。如果要为模型添加新列,它将执行应有的操作;尝试对列进行更复杂的操作,它可能不会像你期望的那样。

例如,如果您创建类型为String的属性,则它最初的长度为50个字符。如果您发现50个字符不足以容纳字符串,则向模型中添加:length => 100将不足以使auto_upgrade更改列的宽度。

你似乎偶然发现了另一个缺点,虽然有人可能会说,在你的情况下,也许DataMapper的行为并不那么糟糕(想想遗留数据库)。但事实是,当您更改关联时,Event的{​​{1}}列未被删除,然后当您尝试保存artist_id时,您将获得错误,因为数据库说它是必填字段。

请注意,您获得的错误不是验证错误:DataMapper认为一切正常,但在尝试保存对象时从数据库中收到错误。

希望这有帮助!

答案 1 :(得分:0)

自动升级根本不是缺点!我认为自动升级是DataMapper的一个便利功能。据我所知,它的唯一目的是为您添加列。因此,无需编写迁移即可快速启动项目,管理测试和开发环境,而不是修改成熟的实时项目的最佳工具。

为此,DataMapper确实有迁移!使用dm-migrations gem。缺点是它们根本没有很好的记录......我实际上正在努力将我当前的项目更改为使用迁移,我希望为dm-migrations github wiki提供一些指示。但是,如果您尚未准备好切换到迁移,则还可以使用SQL客户端手动更新列,然后继续对新列使用自动升级。这就是我在项目上做了2年的事情:))