DB2 与 Ruby on Rails 入门之一(4)
步骤 2:与文档相关的附加属性
在创建 DOCUMENTS 表之后,假设您决定存储关于每个文档的附加信息,例如操作系统平台、上传时间和最近更改时间。产生的 DOCUMENTS 表应该包含以下列(新添加的列用粗体标示)。
表 3. DOCUMENTS 表中的列和描述
列名 | 数据类型 | 描述 |
---|---|---|
ID | Integer | 主键 |
Name | VARCHAR | 文档的名称 |
Size | Integer | 文件大小 |
Data | BLOB | 以二进制模式存储的文件,最大 2 M |
Content_type | VARCHAR | 文档类型,包括:.doc、.ppt、.pdf、.sw、.exe、.a、.so、.gif、.jpeg、.mov、.avi、.mpeg、.bmp 等 |
Created_at | TIMESTAMP | 文件被上传的时间(见注 9) |
Updated_at | TIMESTAMP | 文档最近更新时间戳(见注 9) |
Platform | VARCHAR | 特定于文件平台的信息 |
注 9:对于 Rails,选择的两个列名 created_at 和 updated_at 负有特殊语义。和其他 “magic column names” (id、type、position、lock_version、parent_id>)一样,Rails 将使用这种名称作为惯例。在这种情况下,它将自动用一个行被创建或最近被更新的时间戳来进行更新。它只要求底层数据库列能接收 date、datetime 或 string 类型。完整的 Rails 惯例是,对于 date 列使用 _on 语法,而对于包含时间的列则使用 _at 语法。
然后生成第二个迁移,以便将这些属性添加到 DOCUMENTS 表中:
a) 运行 ruby script/generate migration add_docs_attributes。
这样会生成 db/migrate/002_add_docs_attributes.rb 文件。
清单 10. 创建第二个迁移,以便将列添加到 DOCUMENTS 表中
注 10:迁移的思想是,如果需要更改持久数据库中的内容,则可以生成一个新的迁移来执行更改。不需要为了做出更改而编辑原始的迁移。
b) 像下面这样编辑 002_add_docs_attributes.rb:
清单 11. 查询 SCHEMA_INFO 表
注 11:可以使用 add_column 在 self.up 方法中添加属性。若要逆转更改,可以使用 remove_column。
c) 同样,发出 rake db:migrate 来执行第二个迁移。
清单 12. 运行第二个迁移,将附加列添加到 DOCUMENTS 表中
注 12:可以再次使用 db2 describe table teamroom.documents 来确认新的列是否被添加到 DOCUMENTS 表中。
注 13:
步骤 3:管理用户和他们对资源的访问
组织或社区中的很多人都可能对这些文档感兴趣,所以需要有一种方式来管理那些用户和他们的访问。为此我们添加一个 USERS 表。另外还需要添加一个外键 'user_id' 到 DOCUMENTS 表中,以便知道哪个用户上传某个特定的文档。
下面是执行这些任务所需的步骤:
a) 运行 ruby script/generate migration create_users_table,这将创建 db/migrate/003_create_users_table.rb 文件
b) 像下面这样编辑 db/migrate/003_create_users_table.rb 文件:
清单 13. 编辑 003_create_users_table.rb
c) 运行 rake db:migrate 以创建 USERS 表:
清单 14. 通过迁移创建 USERS 表
d) 现在可以发出 ruby script/generate scaffold document,以便为 DOCUMENTS 表生成一个 scaffold。scaffolding 通过提供列出、显示、创建、更新和销毁类的对象的标准化动作,快速地使一个 Active Record 类上线。如下面的清单 15 所示,在 scaffold 生成期间,/app/controllers 和 /app/views 中创建了一个控制器和多个视图。
清单 15. 为文档创建 scaffold
至此,可以看看 scaffold 可以做哪些事情。在命令提示符下,输入 ruby script/server 以启动用于 Rails 的内置 WEBrick Web 服务器:
清单 16. 启动内置的 WEBrick Web 服务器
注意端口号。默认端口号为 3000,但是如果在系统上端口 3000 已经被占用,那么端口号可能有所不同。打开一个 Web 浏览器,进入 http://localhost:3000/,您将注意到一条欢迎登录消息。浏览至 http://localhost:3000/documents,您将看到:
图 1. 列出文档
e) 编辑生成的 /app/models/document.rb 文件,使之如下所示:
清单 17. 编辑 /app/models/document.rb
belongs_to 表达了 DOCUMENTS 与 USERS 表之间一对一的外键关系。这种关联表明,每个文档只能与一个用户关联(即只能属于一个用户)。如果 DOCUMENTS 表有一个 user_id 外键列,则文档模型为 belongs_to :user。
注 14:包含外键的表的模型总是有 belongs_to 声明。
我们在 /app/models/document.rb 中添加附加的代码,以便可以真正上传文档,并将文件存储在 DB2 9 数据库中。请参阅下载小节,以查看代码实现。在将很多文档添加到 Team Room 之后,在浏览器中可以看到如下所示的界面:
图 2. 列出文档
f) 类似地,发出 ruby script/generate scaffold user,以便为 Users 表生成一个 scaffold。然后编辑 /app/models/user.rb,使之如下所示:
清单 18. 编辑 /app/models/user.rb
注 15: has_many 关联表明一个用户可以上传多个文档。
注 16:请参阅 http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html,了解关于 ActiveRecord 关联的更多信息。
现在,您已经详细理解了前面几个迁移步骤,接下来我们执行剩下的迁移,以创建所需的其他表和关联。