您的位置: 旅游网 > 社会

Rails 上的 HR 模式(二)

发布时间:2019-09-13 19:29:30

数据库和 HR 模式配置 安装 Rails 的服务器上必须安装了 SQL*Plus 客户端(或者 Oracle 即时客户端软件)。必须创建一个 TNSNAMES.ora 项,来引用包含要使用的 HR 模式的数据库。有必要向 Oracle 新用户说明一下:TNSNAMES.ora 文件包含连接 Oracle 数据库的连接信息。数据库可以位于同一计算机上也可以位于远程服务器上。连接信息包括服务器名称、数据库名称和正在使用的数据库端口。Ruby OCI8 程序包使用该信息来让 Rails 与数据库通信。OCI8 层是用 Ruby 编写的层,该层利用底层 Oracle 数据库配置(在 TNSNAMES.ora 中指定)来构建数据库连接。

要创建 Web 应用程序所需的模式对象,首先执行下列任务: 创建一个新用户(此处指定为 HR_RAILS)。注意:附带的脚本会删除现有用户并重建用户。 授予新用户相应的资源和权限以创建其自己的模式并访问 HR 模式。 修改 HR 模式的以下方面: 创建序列来填充主键。 需要修改一个触发器,创建另一个触发器。job_history 表和相关约束需要这些触发器。修改的触发器在插入历史记录之前查看员工的 job_id 或 department_id 是否已经更改。如果员工已被删除,新的触发器会删除员工的工作历史记录。如果需要,可以修改触发器以对这些数据进行归档。 为遵守 Rails 命名惯例的 HR_RAILS 模式创建同义词和视图。

要完成这些任务,运行 create_rails_db_user_and_privs.sql 脚本,并对提示做出相应的回答。例如: C:hr_railshr>sqlplus /nologSQL*Plus:Release 10.1.0.2.0 - Production on Wed Mar 8 12:31:01 2006Copyright (c) 1982, 2004, Oracle.All rights reserved.SQL> @create_rails_db_user_and_privsEnter the DBA user:systemEnter the DBA password:notmanagerEnter the Database Name ( Oracle SID):xeEnter the (new) rails user (user will be DROPPED and created):hr_railsEnter the rails user's password:hr_railsEnter the HR user (to grant the rails user privs):hrEnter the HR user's password:hrConnected....

运行了许多命令后就创建了许多对象。在 create_db_objects.log 文件(在工作目录中创建)中查看结果。 集成数据库和应用程序数据库。以对象为导向的编程专家 Martin Fowler 对应用程序 和集成 数据库做了区分,该区分十分有用。一般来说,应用程序数据库是由单个应用程序使用的数据库,而集成数据库则被大量应用程序访问和使用。Rails 开发以使用应用程序数据库开发应用程序为导向。当前的项目显示了一种结合使用集成数据库和 Rails 的方法。

在该项目中,并没有直接使用 HR 用户访问该模式,而是创建了一个新用户(本文中命名为 hr_rails)。为 Rails 应用程序专门指定一个用户能够使 DBA 清晰地分辩访问所讨论数据库模式的应用程序。此外,Rails 鼓励使用符合标准命名惯例的表和列名称。新模式将包含与底层 HR 表相对应的视图。这些视图自然可更新而不只是能查询,因此也可用于所有插入、更新和删除操作。实际上,该方法是要努力创建一种在某种程度上独立于集成数据库模式的应用程序数据库模式(使用 Fowler 的术语)。

使用 Oracle 的“自然可更新”视图可提供一个有用的界面来利用 ActiveRecord 的对象关系功能。此外,利用这些视图还以一种最适于 Rails 访问的形式对表结构和数据进行格式设置。这些视图还可以隔离 Rails 应用程序,从而增强对访问 HR 模式的 Rails 数据库用户和其他应用程序用户的审计可见性。Oracle SQL 的所有功能(包括 Oracle 对语言和功能扩展)都可通过 find_by_sql 来加以利用。

对于应用程序内的引用,在“关于该站点”页面的一个图像上可以找到实体关系图的一部分。还有一个从该页面(以及从主页)指向另一个页面(该页面查询 Oracle 数据字典以显示视图名称以及列名称和类型)的链接。

更改 HR 模式 尽管 HR 模式基本上保持不变,但是应用程序确实需要一些调整。我添加了 Rails 用于填充表的主键的序列。其他应用程序可能需要访问这种序列,因此 HR 模式本身附带有这种序列。

我修改了一个 HR 模式中已经存在的触发器 (UPDATE_JOB_HISTORY),以便仅在与员工有关的工作或部门发生变化时调用 add_job_history 过程。我做这样的更改是为了将调用该触发器的情形限制在与员工的工作历史记录实际相关的字段上。我又添加了一个触发器 (DELETE_JOB_HISTORY),用来在删除员工时删除员工的工作历史记录。设置数据库约束的方式要求该触发器允许删除员工。例如,在生产应用程序中,可能归档 JOB_HISTORY,员工记录的状态可能是“非活动”。

开发过程用于创建示例应用程序的开发过程大致如下所示:

创建和更新 HR 模式。 创建 HR_RAILS 用户、模式和数据库对象。 通过运行以下命令创建 Rails 应用程序: rails hr

配置 database.yml 文件,以便开发连接、测试连接和生产连接通过有效的用户名和密码连接到正确的数据库。应用程序下载中附带的 database.yml 文件(可在 hrconfig 目录中找到)引用一个名为 XE 的数据库,HR_RAILS 用户使用 HR_RAILS 作为密码访问该数据库。需要将这些值修改为您创建模式时使用的值。Ruby ActiveRecord 类使用该文件建立数据库连接。 生成表的“结构”。利用这些结构(Ruby 模型、视图和控制器)可以查看、创建、更新和删除基表上的记录。这些结构是通过运行作为 Rails 应用程序一部分创建的脚本创建的。 ruby generatescript scaffold <name>

为该站点创建布局。布局提供您在站点的每页上看到的标题、左侧导航栏和页脚部分。 修改 routes.rb 配置以便映射站点首页(这样不需要输入扩展 URL)。 执行涉及模型(如果需要附加数据)、视图(尝试使界面用户友好和实用)和控制器(获得视图数据)修改的多个循环。这是实际的手动编码,完成该编码可更改站点的样式,创建该应用程序特有的功能。 结构。在开发过程中,会生成每个表的完整的模型、视图和控制器。尽管为所有正在使用的模型生成了全部结构,但是最终版本并不包括全部可用功能。用户只能查看地区和国家列表。可以查看、插入、更新和删除位置、部门和员工列表。

模型。每个 Model 类都有类似的特性。下面显示了代表示例。您可以参考代码查看其他详细信息。

输入域验证。Rails 框架努力将验证代码集中在 Model 类中。这种方法有很多好处,最值得一提的是使用 Model 类的所有插入和更新处理都将包括定义的约束,并在验证规则失败时向用户返回一致的消息。但是,该数据库自身还可以并应该用于约束数据。这样就可以限制任何 应用程序或 SQL 语句输入表中的数据。此外,可以使用视图层按照其设计强制执行验证。设计较好的 GUI 可以防止用户选择无效的选项。设置了长度的文本域可防止字符串超过允许的最大长度。下拉框可防止用户在需要包含外键输入的域中输入不符合要求的内容。

员工模型验证确保包括必填域;字符串数据域不超过最大长度;电子邮件唯一;工资是数字。(视图通过强制用户从下拉框中选择数据隐式验证部门和经理)。 validates_presence_of :email, :hire_date, :last_name, :first_name, :phone_number, :salaryvalidates_uniqueness_of :emailvalidates_length_of :first_name, :maximum => 20validates_length_of :last_name, :maximum => 25validates_length_of :email, :maximum => 25validates_length_of :phone_number, :maximum => 20validates_numericality_of :salary, :only_integer => true

此外,员工模型中有自定义验证代码,可确保工资和佣金都设置在有效范围内: def validate if salary != nil if salary < 1 errors.add(:salary, "must be positive.") end if salary > 999999 errors.add(:salary,"must be less than 999999") end endif commission !=nil unless commission >= 0 && commission < 1 errors.add(:commission, "must be greater than 0 and less than 1.") end endend

查询。在与每个 Model 类使用的 INSERT、UPDATE、DELETE 和 SELECT * 查询相关的代码中看不到 SQL 语句。但是,旧模式的一个共同特征就是需要复杂的 SQL 语句来检索或汇总数据。Rails 通过在 Model 类中定义一个 find_by_sql 函数,提供了一种执行复杂的 SQL 语句的方法。

构建公司层级结构的查询如下所示: SELECT tree.*, LEAD (hierarchy_level) OVER (ORDER BY seq) next_level FROM ( SELECT CONNECT_BY_ROOT last_name top_node_name, (last_name || ', ' || first_name ||' ('||job_title||')') employee_name, emp.id employee_id, SYS_CONNECT_BY_PATH (last_name, '->') node_path, LEVEL hierarchy_level, ROWNUM seq FROM( SELECT e.*, j.job_title FROM employees e, jobs j WHERE e.job_id = j.id ) emp START WITH emp.job_title= 'President' CONNECT BY PRIOR emp.id = manager_id ORDER SIBLINGS BY emp.id ) tree ORDER BY seq

以上代码是使用 Oracle SQL 扩展创建的示例层次查询。该代码用于返回构成公司层级结构示例的结构中的数据。显示结果的页面包含 JavaScript,该 JavaScript 允许用户“下钻”层级结构。LEAD 分析函数允许访问多行而无需使用自联接。结果集中的当前行可以有效“预测”下一行中的层级,这极大地简化了用于显示层级结构的 JavaScript 代码。

图 6

定义了与员工模型相关的许多关系。员工属于部门,向经理汇报。在数据库级别,存在反映这些关系的外键约束。Rails 框架还将这些关系为指定一对多。经理本身是员工表中的一个字段。

belongs_to :department belongs_to :manager, :class_name => "Employee", :foreign_key => "manager_id"belongs_to :job has_many :department has_many :managed_employee, :class_name => "Employee", :foreign_key => "manager_id"

这些关系设置了大量方便方法,使得程序员通过模型对象轻松访问相关数据。

控制器。对生成的控制器对象的修改相对较少。主控制器为主视图和活动视图添加了方法。员工视图包括几个对用于填充经理和部门下拉框的模型的附加调用。其余代码只是自动生成的结构的一部分。

修改了 configroutes.rb 文件,以便 http://localhost:3000 映射到应用程序的主页。 视图。站点中的所有页面都有公用的标题、左侧导航栏和页脚。这些都被整合到一个布局 文件中。默认情况下,Rails 查找 /app/views/layout 目录中一个名为 <controller_name>_layout.<xml or rhtml> 的布局。但是,如果您在 layouts 目录中创建一个名为 application 的布局,则没有基于控制器名称的布局的控制器将使用该布局。

视图利用了许多 Rails 类,这些类旨在将视图中显示的代码的数量减至最少。使用 number_to_currency 帮助器或 number_with_precision 帮助器将数字数据转换为货币格式。 Rails 还包括一些 JavaScript 库,这些库提供大量与 AJAX 支持和 DOM 处理相关的服务。虽然这些服务的用途并不广泛,但是可以提供点击大多数页面上的图像时使图像不显示的视觉效果。此外,还包括其他一些 JavaScript 函数,利用这些函数可实现鼠标放置按钮效果和公司层级结构下钻。

高级 Oracle 功能 示例应用程序利用 Rails 功能自动生成主键插入、更新和删除以及从表中选择所需的简单 SQL 语句。但是,也包括一些使用 Oracle SQL 的查询。region.rb 模型包含创建地区赔偿报告 (GROUP BY ROLLUP) 以及列出应用程序使用的视图的模式报告 (LAG OVER) 的 SQL。employee.rb 模型包括用于构建公司层级结构的查询。该查询使用 CONNECT BY 执行递归搜索以及 LEAD OVER。

结论 HR 将继续提供广受欢迎的模式来演示 SQL 功能。如该应用程序所演示的,它还是说明如何使用 Ruby on Rails 创建利用旧模式的 Web 应用程序的示例。

查看本文来源

一岁宝宝营养不良怎么办
怎么样治脑梗
小儿脾胃虚弱饮食方
薏芽健脾凝胶怎么吃
猜你会喜欢的
猜你会喜欢的