顶部468*60ad 顶部468*60ad

DB2 与 Ruby on Rails 入门之一

2007-12-06 23:55:31  来源

  步骤 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 表中

D:\rails\teamroom>ruby script/generate migration add_docs_attributes
      exists  db/migrate
      create  db/migrate/002_add_docs_attributes.rb 

  注 10:迁移的思想是,如果需要更改持久数据库中的内容,则可以生成一个新的迁移来执行更改。不需要为了做出更改而编辑原始的迁移。

  b) 像下面这样编辑 002_add_docs_attributes.rb:

  清单 11. 查询 SCHEMA_INFO 表

class AddDocsAttributes < ActiveRecord::Migration
  def self.up
    add_column :documents, :created_at, :timestamp
    add_column :documents, :updated_at, :timestamp
    add_column :documents, :platform,   :string,    :limit => 10
  end

  def self.down
    remove_column :documents, :created_at
    remove_column :documents, :updated_at
    remove_column :documents, :platform
  end
end 

  注 11:可以使用 add_column 在 self.up 方法中添加属性。若要逆转更改,可以使用 remove_column。

  c) 同样,发出 rake db:migrate 来执行第二个迁移。

  清单 12. 运行第二个迁移,将附加列添加到 DOCUMENTS 表中

D:\rails\teamroom>rake db:migrate
(in D:/rails/teamroom)
== AddDocsAttributes: migrating ===============================================
-- add_column(:documents, :created_at, :timestamp)
   -> 0.0500s
-- add_column(:documents, :updated_at, :timestamp)
   -> 0.0100s
-- add_column(:documents, :platform, :string, {:limit=>10})
   -> 0.0000s
== AddDocsAttributes: migrated (0.0600s) ====================================== 

  注 12:可以再次使用 db2 describe table teamroom.documents 来确认新的列是否被添加到 DOCUMENTS 表中。

  注 13: _id 是对以复数形式命名为 的表的外键引用的默认名称。在 Rails 中,诸如外键之类的关联是通过模型关系实现的。该框架用于管理这种模型关系的重要惯例之一是表的主键列(它的 id )的默认名称,而对表的外键引用的默认名称为 _id (表名是复数形式的 )。 Rails 迁移并不定义外键约束,理解这一点很重要。表之间的关系是在开发人员用来自有某种关系的表中的健值填充列时设置的。建议另外还通过迁移在数据库中建立并强制实施那些约束,不过这不是 Rails 框架的需求。

  步骤 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

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,您将看到:

  图 1. 列出文档

  DB2 与 Ruby on Rails 入门之一_网页教学网webjx.com转载整理

  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。

  注 14:包含外键的表的模型总是有 belongs_to 声明。

  我们在 /app/models/document.rb 中添加附加的代码,以便可以真正上传文档,并将文件存储在 DB2 9 数据库中。请参阅下载小节,以查看代码实现。在将很多文档添加到 Team Room 之后,在浏览器中可以看到如下所示的界面:

  图 2. 列出文档

  DB2 与 Ruby on Rails 入门之一_网页教学网webjx.com转载整理

  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 

  注 15: has_many 关联表明一个用户可以上传多个文档。

  注 16:请参阅 http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html,了解关于 ActiveRecord 关联的更多信息。

  现在,您已经详细理解了前面几个迁移步骤,接下来我们执行剩下的迁移,以创建所需的其他表和关联。

文章评论

共有 0 位网友发表了评论 查看完整内容

推荐文章