我有一个使用数据库作为其内容的 Web 界面。该数据库几乎是任意设计的,没有遵循任何标准。
我想在这个数据库之上编写一些 API。我的前端将使用这些 API。
我使用 ActiveRecord 作为 ORM。问题是我无法在现有表上定义任何关联或联接,因为这两个操作都需要id
在引用表中命名的列。
鉴于我不想修改现有的数据库模式,该怎么做?
我有一个使用数据库作为其内容的 Web 界面。该数据库几乎是任意设计的,没有遵循任何标准。
我想在这个数据库之上编写一些 API。我的前端将使用这些 API。
我使用 ActiveRecord 作为 ORM。问题是我无法在现有表上定义任何关联或联接,因为这两个操作都需要id
在引用表中命名的列。
鉴于我不想修改现有的数据库模式,该怎么做?
当您定义关联时,您可以使用附加选项,例如 :foreign_key 和 :primary_key 来指定有关此类字段名称的详细信息。
belongs_to :person, :primary_key => "name", :foreign_key => "person_name"
过去,我尝试使用 ActiveRecord 处理遗留数据库,并且成功了,但是,这样做肯定是在逆流而上。ActiveRecord 不想使用具有不同命名约定的字段和表,因此需要做很多工作。从那以后,它变得更加文明,并且在“不是这里发明”的态度上更加宽容。但是,它也不是镇上唯一的 ORM,而且我已经成为这类任务的 Sequel 的忠实粉丝。
您可以使用Sequel作为 ActiveRecord 的替代品。这是一个很棒的 ORM,可以很好地与遗留数据库配合使用。您可以定义您的:id
字段应该是什么,以及指定所有真实字段和表名(如果它们未映射到预期格式)。
查看“备忘单”了解 Sequel 的工作原理,查看“Sequel for ActiveRecord Users”了解它如何替代 ActiveRecord 供您使用。
利用:
Sequel-talk 小组非常活跃,如果您需要帮助,可以为您指明正确的方向。而且,主要作者 Jeremy Evens 是项目负责人的一个很好的例子——他总是乐于助人。
我为您看到了一些选择:
选择其中一个很大程度上取决于您的要求——应该完成多快,是否必须保留旧数据(在这种情况下,您不能真正使用 1.),当前模式有多混乱等等.,但我认为你应该尝试推动选项1。
考虑使用 Sinatra 而不是 Rails。如果您只想为“丑陋”的数据库提供 API,请不要从 activerecord 开始。
添加您的路线,并直接在您的操作中定义 SQL 语句。不应该比修改 activerecord 的期望更昂贵。