2

我有一个现有的旧版 Firebird 数据库,其中包含非标准的表和字段名称。

我想编写一个可以访问它并显示信息的 Sinatra 应用程序。我已经看到像 dm-is-reflective 这样的东西在数据库具有适当的命名约定时似乎可以工作,但是我如何使用 DataMapper(或 ActiveRecord,无论哪个最简单)来访问这些表?

例如,假设我有这两个表:

Bookshelfs
    shelf_id: integer
    level: integer
    created: timestamp

Book
    id: integer
    id_of_shelf: integer
    title: string
    pages: integer

类似于不遵循任何设定模式的奇怪命名约定,即使没有分配 foreign_key,一个表的记录也可能“拥有”另一个表中的多个条目。

您将如何设置 datamapper(或 activerecord)与它进行通信?

4

2 回答 2

2

查看此 gem 以在 Sinatra 上使用 ActiveRecord 进行设置: https ://github.com/bmizerany/sinatra-activerecord

至于如何定义关系,activerecord 可以很容易地做到这一点。

class Book < ActiveRecord::Base
  belongs_to :bookshelf, :class_name => 'Bookshelf', :foreign_key => 'id_of_shelf'
end

class Bookshelf < ActiveRecord::Base
  has_many :books, :class_name => 'Book', :foreign_key => 'id_of_shelf'
end
于 2012-09-26T17:42:44.070 回答
1

假设您知道如何使用 ActiveRecord 的 Firebird 适配器连接到旧数据库,接下来我要做的就是在每个表的顶部定义一个视图,例如

CREATE VIEW books AS SELECT * FROM Book;
CREATE VIEW bookshelves AS SELECT * FROM Bookshelfs;

这样,您可以像往常一样在 ActiveRecord 中简单地定义模型 Book 和 Bookshelf,它会在数据库中的正确位置找到所有内容。

于 2012-09-26T20:31:07.197 回答