DB2 与 Ruby on Rails 入门之一
步骤 4:管理逐渐增长的共享文档集合
如果有一种方式来对社区所贡献的大量文档进行分类,以便添加基于内容主题的分类学,那么显然很有帮助。SUBJECTS 表将被创建,以帮助对文档进行分类。一个主题可以包含很多文档,但是每个文档只能属于一个主题。为了演示 SUBJECTS 与 DOCUMENTS 之间的这种一对多的关系,需要将一个 Subject ID 外键添加到 DOCUMENTS 中。
Webjx.Com
下面是执行这些任务所需的步骤:
网页教学网
a) 运行 ruby script/generate migration create_subjects_table,这将创建 db/migrate/004_create_subjects_table.rb 文件。 网页教学网
b) 像下面这样编辑 db/migrate/004_create_subjects_table.rb:
Webjx.Com
清单 19. 创建 SUBJECTS 表
| class CreateSubjectsTable < ActiveRecord::Migration def self.up create_table :subjects do |t| t.column :name, :string, :limit => 20 t.column :size, :integer t.column :description, :text t.column :tag, :string, :limit => 10 end add_column :documents, :subject_id, :integer end def self.down drop_table :subjects remove_column :documents, :subject_id end end |
c) 运行 rake db:migrate,以创建 SUBJECTS 表并添加 subject_id 外键。 Webjx.Com
d) 运行 ruby script/generate scaffold subject,为 SUBJECTS 表生成 scaffold。
e) 添加 has_many :document 关联到新生成的 /app/models/subject.rb 文件中。 Webjx.Com
清单 20. 添加关联到 subject 模型中
| class Subject < ActiveRecord::Base has_many :document end |
f) 再添加一个关联 belongs_to :subject 到步骤 3(d) 中生成的 /app/models/document.rb 文件中。
清单 21. 添加关联到文档模型中
| class Document < ActiveRecord::Base belongs_to :user belongs_to :subject <... code to assist with document uploading ...> <... ...> end end |
步骤 5:管理用户通知需要
当一个新文档被上传到一个特定类别时,如果有一种方式来通知用户,那么会怎样呢?如果可以在一个 SUBSCRIPTIONS 表中收集那些对通知的请求,就很容易实现这一点。这里还需要考虑用户、主题和订阅之间的一些关系。
我们首先来描述用例场景:用户 Anthony 想在关于某些主题:编程、Linux 和钓鱼的新文档被上传时收到通知。他将浏览至一个显示目前已创建的所有主题的页面,然后勾选与上述主题相关的复选框。然后,每当关于这三个主题中任何一个主题的新文档被上传时,应用程序将生成一个通知消息,该消息通过电子邮件被发送到订阅了这些主题的用户。整个场景可以表达为以下一组关系:
1、每个用户最多只能有一项订阅,但订阅不是必需的(例如,one-to-none、one... 关系)。
- 需要将一个外键 user_id 添加到 SUBSCRIPTIONS 表中。
- 用户与订阅模型之间需要包括一个一对一关系。
2、每项用户订阅可以包括一些偏好的主题(例如一对多关系)。用户可以通过某种方式从所有可用的主题中进行选择。
- 需要将一个外键 subscription_id 添加到 SUBJECTS 表中。
- 订阅与主题模型之间需要包括一个一对多关系。
通过与前面类似的迁移步骤,可以达到这些数据库设计目标:
a) 运行 ruby script/generate migration create_subscriptions_table 将创建 db/migrate/005_create_subscriptions_table.rb 文件。
b) 编辑 db/migrate/005_create_subscriptions_table.rb:
网页教学网
清单 22. 创建 SUBSCRIPTIONS 表
| class CreateSubscriptionsTable < ActiveRecord::Migration def self.up create_table :subscriptions do |t| t.column :name, :string, :limit => 20 t.column :description, :text t.column :user_id, :integer end add_column :subjects, :subscription_id, :integer end def self.down drop_table :subscriptions remove_column :subjects, :subscription_id 网页教学网 end end |
c) 运行 rake db:migrate 以创建 SUBSCRIPTIONS 表并将外键列添加到 SUBJECTS 中。 网页教学网
d) 运行 ruby script/generate scaffold subscription 为 SUBSCRIPTIONS 生成一个 scaffold。
Webjx.Com
e) 将 has_many :subject 关联添加到步骤 4 d 生成的 /app/models/subscription.rb 文件中。 网页教学网
f) 将相应的关联 belongs_to :subscription 添加到新生成的 /app/models/subject.rb 文件中。
g) 将 has_one :subscription 关联添加到步骤 3 f 生成的 /app/models/user.rb 文件中。
h) 将 belongs_to :user 关联添加到新生成的 /app/models/subscription.rb 文件中。
注 17: 细心的读者肯定会发现,目前的订阅设计并不完全实际或者可用:一个主题只能属于一项订阅,因此一旦 Anthony 在他的订阅页面选中了一个主题,那么 Bob 就不能再选择这个主题。显然,那应该是多对多的关系,不过现在这样做可以简化问题(例如,现在没有中间连接表)。这个问题在本系列的第 2 部分肯定会得到修复。 Webjx.Com
步骤 6:管理用户联系方式
将关于 Team Room 更新的消息通知给用户的一种方法是通过电子邮件。为此,需要添加每个用户的电子邮箱,因此通过另一个迁移将一个 email 列添加到 USERS 表中: Webjx.Com
a) 运行 ruby script/generate migration addEmailToUser。这将生成 db/migrate/006_add_email_to_user.rb 文件。 Webjx.Com
b) 编辑 006_add_email_to_user.rb。
清单 23. 添加 email 信息到 USERS 表中
| class AddEmailToUser < ActiveRecord::Migration def self.up add_column :users, :email, :string, :limit => 30 end def self.down remove_column :users, :email end end |
c) 运行 rake db:migrate,将 email 列添加到 USERS 表中。
下面的图演示了步骤 1 到步骤 6 所执行的操作。 Webjx.Com
图 3. 不同模型之间的关联 Webjx.Com
网页教学网






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