组织或社区中的很多人都可能对这些文档感兴趣,所以需要有一种方式来管理那些用户和他们的访问。为此我们添加一个 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
|
现在,您已经详细理解了前面几个迁移步骤,接下来我们执行剩下的迁移,以创建所需的其他表和关联。
