组织或社区中的很多人都可能对这些文档感兴趣,所以需要有一种方式来管理那些用户和他们的访问。为此我们添加一个 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
class CreateUsersTable < ActiveRecord::Migration def self.up create_table :users do |t| t.column :usertype, :string, :limit => 5, :null => false t.column :firstname, :string, :limit => 30 t.column :lastname, :string, :limit => 30 t.column :extension, :string, :limit => 4 end add_column :documents, :user_id, :integer end def self.down drop_table :users remove_column :documents, :user_id end end |
c) 运行rake db:migrate以创建 USERS 表:
清单 14. 通过迁移创建 USERS 表
D:\rails\teamroom>rake db:migrate (in D:/rails/teamroom) == CreateUsersTable: migrating ================================================ -- create_table(:users) -> 0.1400s -- add_column(:documents, :user_id, :integer) -> 0.0000s == CreateUsersTable: migrated (0.1400s) ======================================= |
d) 现在可以发出ruby script/generate scaffold document,以便为 DOCUMENTS 表生成一个 scaffold。scaffolding 通过提供列出、显示、创建、更新和销毁类的对象的标准化动作,快速地使一个 Active Record 类上线。如下面的清单 15 所示,在 scaffold 生成期间,/app/controllers 和 /app/views 中创建了一个控制器和多个视图。
清单 15. 为文档创建 scaffold
D:\rails\teamroom>ruby script/generate scaffold document exists app/controllers/ exists app/helpers/ create app/views/documents create app/views/layouts/ create test/functional/ dependency model create app/models/ exists test/unit/ exists test/fixtures/ create app/models/document.rb create test/unit/document_test.rb create test/fixtures/documents.yml create app/views/documents/_form.rhtml create app/views/documents/list.rhtml create app/views/documents/show.rhtml create app/views/documents/new.rhtml create app/views/documents/edit.rhtml create app/controllers/documents_controller.rb create test/functional/documents_controller_test.rb create app/helpers/documents_helper.rb create app/views/layouts/documents.rhtml create public/stylesheets/scaffold.css |
至此,可以看看 scaffold 可以做哪些事情。在命令提示符下,输入ruby script/server以启动用于 Rails 的内置 WEBrick Web 服务器:
清单 16. 启动内置的 WEBrick Web 服务器
D:\rails\teamroom>ruby script/server => Booting WEBrick... => Rails application started on http://0.0.0.0:3000 => Ctrl-C to shutdown server; call with --help for options [2007-04-26 16:54:57] INFO WEBrick 1.3.1 [2007-04-26 16:54:57] INFO ruby 1.8.5 (2006-12-25) [i386-mswin32] [2007-04-26 16:54:57] INFO WEBrick::HTTPServer#start: pid=444 port=3000 |
注意端口号。默认端口号为 3000,但是如果在系统上端口 3000 已经被占用,那么端口号可能有所不同。打开一个 Web 浏览器,进入http://localhost:3000/,您将注意到一条欢迎登录消息。浏览至 http://localhost:3000/documents,您将看到:
e) 编辑生成的 /app/models/document.rb 文件,使之如下所示:
清单 17. 编辑 /app/models/document.rb
class Document < ActiveRecord::Base belongs_to :user end |
belongs_to 表达了 DOCUMENTS 与 USERS 表之间一对一的外键关系。这种关联表明,每个文档只能与一个用户关联(即只能属于一个用户)。如果 DOCUMENTS 表有一个
user_id
外键列,则文档模型为belongs_to :user
。
我们在 /app/models/document.rb 中添加附加的代码,以便可以真正上传文档,并将文件存储在 DB2 9 数据库中。请参阅下载小节,以查看代码实现。在将很多文档添加到 Team Room 之后,在浏览器中可以看到如下所示的界面:
f) 类似地,发出ruby script/generate scaffold user,以便为 Users 表生成一个 scaffold。然后编辑 /app/models/user.rb,使之如下所示:
清单 18. 编辑 /app/models/user.rb
class User < ActiveRecord::Base has_many :document end |
现在,您已经详细理解了前面几个迁移步骤,接下来我们执行剩下的迁移,以创建所需的其他表和关联。