国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

Rails 上的 HR 模式

2024-07-21 02:33:34
字體:
來源:轉載
供稿:網友
2006 年 6 月發表    Oracle 數據庫有著輝煌的歷史和光明未來。它擁有最新的創新特性以及超前很多現代技術的歷史。應用程序不斷更替,但是組織的數據一直保留在已通過各種版本遷移的 Oracle 數據庫中。由于現在存在大量的舊模式,這已經帶來了技術上的挑戰。許多組織面臨著如何使其客戶群更廣泛地利用這些數據的挑戰。     Ruby on Rails(或者簡稱“Rails”)是一個令人振奮的新框架,開發人員、DBA 和系統治理員可以使用該框架快速開發 Web 應用程序。該框架是開發源代碼的,很快獲得了廣泛的認同。使用該框架,您可以比使用其他框架更快速地構建和開發與數據庫集成的 Web 應用程序。   現在提供的大多數 Rails 示例和教程都包括創建一個帶表和列的新數據庫,這些表和列遵守該框架要求的結構和命名慣例。這些教程還假設一個相當簡單的對象關系映射 — 使用舊模式時該映射不適用。但是,該框架和 Oracle 數據庫都提供一些特性,這些特性可用于創建與舊模式集成的 Web 應用程序。   本文說明創建 Oracle 演示模式 HR 的 Web 前端的技巧。本文供下載的代碼包括一個完整的 Ruby on Rails Web 應用程序,該應用程序在 HR 模式上開發,該模式在 Oracle Database 10g 快捷版 (XE) 上運行。   下載的應用程序可在 Windows 或 linux 上運行。Linux 用戶在執行本文說明的命令時應將所有反斜線轉換為正斜線。

為什么使用 Ruby on Rails?

   可用于 Web 開發的平臺有很多,包括 Microsoft .Net、java 2 企業版和 php。此外,大家廣泛認為 Oracle 數據庫 10g 的特性(也可以單獨提供)Oracle application EXPRess(以前的 Html DB)是快速開發與 Oracle 數據庫集成的 Web 應用程序的理想平臺。那么為什么還對一個使用相對不熟悉的語言的新平臺這么感愛好呢?    依設計,Rails 可以進行極快的 Web 應用程序開發。Rails 是通過遵守慣例而不是強制開發人員預先做出所有配置決定來做到這一點的。安裝了 Ruby 和各種所需的程序包之后,您只需運行不到六個命令和編輯一個文件 (database.yml) 就可以創建一個最小的 Web 應用程序。附帶的代碼生成器或代碼庫可應對 Web 開發中很多最常見的任務。Ruby 語言具有 Java 等語言的以對象為導向的功能,但是還可以用于創建簡單的腳本。該語言的功能范圍使您無需借助各種不同技術來完成手邊的任務就可以創建應用程序。   Rails 因其加速了應用程序的開發而幾乎譽滿天下。之所以取得這樣的成功,是因為遵守了編碼標準和命名慣例。除了 Rails 框架要求之外,這些標準和慣例通常也是很好的編碼做法。傳統模式與 Oracle 和 Rails 集成的有關慣例包括:
  • 使用表所代表的模型的復數形式命名表。例如,“employee”模型映射到“employees”表。
  • 包含將更新數據的所有表都包含一個稱為“id”的主鍵。
  • 假如是 Oracle 數據庫,該主鍵使用一個序列遞增,序列名稱基于主鍵遞增的表的名稱。名為“employees”、包含“id”的表將按名為“employee_seq”的序列遞增。
    繼續創建在舊模式下運行的 Rails 應用程序的方法有很多。一些技巧涉及使用 Rails 特性,還有一些技巧涉及修改底層數據庫對象。演示 Web 應用程序并不嘗試說明繼續進行的每個可能方法,而是嘗試利用以這樣的方式利用 Oracle 和 Rails 的強大功能,提供一個清楚、開發速度快、輕易維護的合理解決方案。   Rails 社區將 Ruby on Rails 框架的特征歸結為“教條化”。這可以看作是肯定性的描述,表明該軟件的設計加強了對標準和慣例的遵守。但是,這樣的目標也引出了這樣的擔憂 — 該框架將限制或約束應用程序開發。我們的應用程序包括實現表明框架靈活性的一些要求。   Ruby on Rails 框架提供在新的或舊的數據庫模式上快速構建 Web 應用程序所需的工具??匆幌?rake(一個 Ruby 構建實用程序)的輸出,這可以讓您感受一下創建該項目所付出的努力:C:/hr_rails/hr>rake stats(in E:/ruby_apps/hr_rails/hr)+----------------------+-------+-------+---------+---------+-----+-------+ Name Lines LOC Classes Methods M/C LOC/M +----------------------+-------+-------+---------+---------+-----+-------+ Helpers 15 14 0 0 0 0 Controllers 243 193 7 35 5 3 Components 0 0 0 0 0 0 Functional tests 440 315 10 50 5 4 Models 177 149 6 5 0 27 Unit tests 50 35 5 5 1 5 Libraries 0 0 0 0 0 0 +----------------------+-------+-------+---------+---------+-----+-------+ Total 925 706 28 95 3 5 +----------------------+-------+-------+---------+---------+-----+-------+Code LOC:356 Test LOC:350 Code to Test Ratio: 1:1.0
開發該應用程序需要的類不到 30 個,代碼不到 400 行!

安裝和運行 Web 應用程序

    安裝 Oracle 數據庫 XE、Ruby、Rails 和 OCI8 程序包是安裝該應用程序的前提條件。由于介紹每個過程將需要一系列文章,因此我僅向您提供安裝資源參考:
  • 安裝 Oracle 數據庫非凡版
  • 安裝 Ruby 和 Rails
  • 安裝 OCI8(“PHP OCI8 擴展”部分)
   安裝這些程序后,下載并解壓縮 hr_rails.zip 文件,該文件包含與本文相關的所有代碼資源。解壓縮的文件具有向右顯示的以下目錄結構(圖 1)。 Rails 上的 HR 模式(圖一)圖 1:目錄結構     該目錄結構沒有什么非凡的,它是所有 Rails 應用程序的標準結構。應用程序的名稱(本示例為 hr)顯示為根目錄。app 目錄中的 models、views 和 controllers 目錄包含大量的應用程序代碼。config 目錄包含 database.yml 文件(用于配置數據庫連接)和 routes.rb 文件(用于定義充當應用程序索引的頁面)。public 文件夾包含保存 Web 資源的目錄,包括腳本、圖像和樣式表。盡管本文沒有討論,但 test 目錄包含與對應用程序進行單元測試相關的資源。安裝了軟件、創建了模式并配置了 Rails 應用程序后,就可以運行該應用程序了。從 hr 目錄,運行: ruby script/server    該命令啟動 WEBBrick(隨安裝程序附帶的 Ruby Web 服務器)。在 Web 瀏覽器中,輸入將在端口 3000 運行的 Web 應用程序的 URL,例如 http://localhost:3000。 下面列出了在應用程序中顯示的頁面的示例:
Rails 上的 HR 模式(圖二)圖 2:主頁  Rails 上的 HR 模式(圖三)圖 3:地區賠償報告  Rails 上的 HR 模式(圖四)圖 4:員工列表  Rails 上的 HR 模式(圖五)圖 5:員工編輯

接下來,我們來看看應用程序的數據庫和模式配置。  

數據庫和 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_rails/hr>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 文件(可在 /hr/config 目錄中找到)引用一個名為 XE 的數據庫,HR_RAILS 用戶使用 HR_RAILS 作為密碼訪問該數據庫。需要將這些值修改為您創建模式時使用的值。Ruby ActiveRecord 類使用該文件建立數據庫連接。
  • 生成表的“結構”。利用這些結構(Ruby 模型、視圖和控制器)可以查看、創建、更新和刪除基表上的記錄。這些結構是通過運行作為 Rails 應用程序一部分創建的腳本創建的。 ruby generate/script 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 代碼。
Rails 上的 HR 模式(圖六)圖 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"這些關系設置了大量方便方法,使得程序員通過模型對象輕松訪問相關數據。    控制器。對生成的控制器對象的修改相對較少。主控制器為主視圖和活動視圖添加了方法。員工視圖包括幾個對用于填充經理和部門下拉框的模型的附加調用。其余代碼只是自動生成的結構的一部分。    修改了 config/routes.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 應用程序的示例。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 凤阳县| 芷江| 大竹县| 扬中市| 丹江口市| 亚东县| 龙里县| 庆阳市| 彰化市| 饶平县| 大邑县| 马关县| 巴里| 辽源市| 许昌市| 南江县| 上虞市| 浠水县| 瑞昌市| 定南县| 胶南市| 江山市| 敦化市| 岢岚县| 密云县| 南漳县| 启东市| 怀宁县| 三亚市| 弥勒县| 海阳市| 肃宁县| 湟源县| 南溪县| 黔江区| 肥东县| 东台市| 郓城县| 平邑县| 阜康市| 乌拉特后旗|