技术开发 频道

DB2与Ruby on Rails入门


步骤 5:管理用户通知需要

    当一个新文档被上传到一个特定类别时,如果有一种方式来通知用户,那么会怎样呢?如果可以在一个 SUBSCRIPTIONS 表中收集那些对通知的请求,就很容易实现这一点。这里还需要考虑用户、主题和订阅之间的一些关系。

    我们首先来描述用例场景:用户 Anthony 想在关于某些主题:编程、Linux 和钓鱼的新文档被上传时收到通知。他将浏览至一个显示目前已创建的所有主题的页面,然后勾选与上述主题相关的复选框。然后,每当关于这三个主题中任何一个主题的新文档被上传时,应用程序将生成一个通知消息,该消息通过电子邮件被发送到订阅了这些主题的用户。整个场景可以表达为以下一组关系:

  • 每个用户最多只能有一项订阅,但订阅不是必需的(例如,one-to-none、one... 关系)。
    • 需要将一个外键 user_id 添加到 SUBSCRIPTIONS 表中。
    • 用户与订阅模型之间需要包括一个一对一关系。
  • 每项用户订阅可以包括一些偏好的主题(例如一对多关系)。用户可以通过某种方式从所有可用的主题中进行选择。
    • 需要将一个外键 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。

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 文件中。

0
相关文章