在现有数据库之上开始使用ROR

时间:2013-01-14 12:58:26

标签: ruby-on-rails ruby rails-activerecord

我有一个Web界面,它使用数据库作为其内容。数据库几乎是任意设计的,没有遵循任何标准。

我想在这个数据库之上编写一些API。我的前端将使用这些API。

我使用ActiveRecord作为ORM。问题是我无法在现有表上定义任何关联或连接,因为这两个操作都希望引用表中的列为id

考虑到我不想缓和现有的数据库架构,有什么办法呢?

4 个答案:

答案 0 :(得分:3)

定义关联时,可以使用其他选项,例如:foreign_key和:primary_key,以指定有关此类字段名称的详细信息。

belongs_to :person, :primary_key => "name", :foreign_key => "person_name"

答案 1 :(得分:2)

在过去,我尝试使用ActiveRecord来处理遗留数据库,并且成功了,但是,在这样做的时候,我肯定会反对流程。 ActiveRecord不想使用具有不同命名约定的字段和表,因此需要做很多工作。从那以后,它变得更加文明,并且在“不是在这里发明”的态度上更加宽容。但是,它也不是镇上唯一的ORM,而且我已成为Sequel的忠实粉丝。

您可以使用Sequel代替ActiveRecord。这是一个很棒的ORM,可以很好地与遗留数据库配合使用。您可以定义:id字段应该是什么,并指定所有真实字段和表名称(如果它们未映射到预期格式)。

请查看"Cheat sheet"以了解Sequel的工作原理,并"Sequel for ActiveRecord Users"了解如何替换ActiveRecord以供您使用。

使用:

Sequel-talk group非常活跃,如果您需要帮助,可以指出正确的方向。而且,主要作者杰里米·埃文斯(Jeremy Evens)是项目负责人的一个很好的例子 - 他总是很有帮助。

答案 2 :(得分:0)

考虑使用Sinatra而不是Rails。如果您只想为“丑陋”数据库提供API,请不要以activerecord开头。

添加路由,并直接在您的操作中定义SQL语句。不应该比修补activerecord的预期更昂贵。

答案 3 :(得分:0)

我为您看到了几个选项:

  1. 使用ActiveRecord重新构建模式,然后编写一些将旧数据导入新模式的脚本; (IMO的最佳解决方案,虽然耗时)
  2. 您不使用ActiveRecord,而是直接访问数据库; (难看)
  3. 你继续将ActiveRecord与旧数据一起使用,正如thorstenmüller建议的那样,使用特殊参数告诉Rails哪些列用作键等等(最丑的,需要相当多的hackarounds)
  4. 挑选其中一个很大程度上取决于你的要求 - 如果必须保留旧数据,应该多快完成(在这种情况下你不能真正使用1),如何弄乱当前架构是等等,但我认为你应该尝试推进选项1。