Rails简介

Rails(Ruby on ails)是使用纯ruby编写的ORM框架(framework)。它对web开发提供了强有力的支持,如支持数据映射、MVC模式、Web Services、安全等。而且这些功能操作起来要比同类的产品容易的多,如MVC模式就比struts更容易使用。除了这些,rails还可以根据模板自动生成web程序。这样可以省去我们很多的时间。在讨论ruby如何借助rails快速开发web程序之前,让我们先看看如何安装和运行ruby和 rails。

Rails与数据库之间的交互需要各个数据库厂商提供一个adapter(也可以称之为方言);神通数据库目前并没有基于ruby-aci开发针对Rails开发adapter,但可以用odbc_adapter方式来使用,odbc_adapter依赖DBD::ODBC接口。

../../../../_images/lay3.png

Rails 安装

安装前提

部署好ruby、gem相关ruby的基础环境。

安装Rails

rails 版本:Rails 5.0.7.2

  • 安装方式:gem 包
  • 安装过程:

依赖包:

gem install concurrent-ruby-1.1.5.gem

gem install thread_safe-0.3.6.gem

gem install tzinfo-1.2.5.gem

gem install i18n-1.6.0.gem

gem install activesupport-5.0.7.2.gem

gem install mini_portile2-2.4.0.gem

gem install nokogiri-1.10.2.gem

gem install rails-dom-testing-2.0.3.gem

gem install crass-1.0.4.gem

gem install loofah-2.2.3.gem

gem install rails-html-sanitizer-1.0.4.gem

gem install erubis-2.7.0.gem

gem install builder-3.2.3.gem

gem install actionview-5.0.7.2.gem

gem install rack-2.0.7.gem

gem install rack-test-0.6.3.gem

gem install actionpack-5.0.7.2.gem

gem install sprockets-3.7.2.gem

gem install sprockets-rails-3.2.1.gem

gem install method_source-0.9.2.gem

gem install thor-0.20.3.gem

gem install railties-5.0.7.2.gem

gem install websocket-extensions-0.1.3.gem

gem install websocket-driver-0.6.5.gem

gem install nio4r-2.3.1.gem

gem install actioncable-5.0.7.2.gem

gem install globalid-0.4.2.gem

gem install activejob-5.0.7.2.gem

gem install mini_mime-1.0.1.gem

gem install mail-2.7.1.gem

gem install actionmailer-5.0.7.2.gem

gem install arel-7.1.4.gem

gem install activemodel-5.0.7.2.gem

gem install activerecord-5.0.7.2.gem

rails 包:

gem install rails-5.0.7.2.gem

备注:最新的 rails 是 5.2.3,但 odbc-adapter 不支持

odbc-adapter部署

odbc-adapter安装前提

请部署好ruby-odbc、DBD::ODBC、DBI组件,详细参考ruyb-odbc程序员开发手册。

odbc-adapter安装

  • odbc-apater 版本:Rails 5.0.5
  • 安装方式:gem 包
  • 安装过程:

gem install odbc_adapter-5.0.5.gem

数据库连接测试

安装以下组件

gem install puma-3.12.1.gem

gem install tilt-2.0.9.gem

gem install ffi-1.10.0.gem

gem install rb-inotify-0.10.0.gem

gem install rb-fsevent-0.10.3.gem

gem install sass-listen-4.0.0.gem

gem install sass-3.7.4.gem

gem install sass-rails-5.0.7.gem

gem install execjs-2.7.0.gem

gem install uglifier-4.1.20.gem

gem install coffee-script-source-1.12.2.gem

gem install coffee-script-2.4.1.gem

gem install coffee-rails-4.2.2.gem

gem install jquery-rails-4.3.3.gem

gem install turbolinks-source-5.2.0.gem

gem install turbolinks-5.2.0.gem

gem install multi_json-1.13.1.gem

gem install jbuilder-2.8.0.gem

gem install byebug-11.0.1.gem

gem install bindex-0.7.0.gem

gem install web-console-3.7.0.gem

gem install ruby_dep-1.5.0.gem

gem install listen-3.1.5.gem

创建一个 rails 应用

rails new stdb

修改 Gemfile 文件

cd stdb

vi Gemfile

注释:gem 'sqlite3'

添加:

gem 'execjs'

gem 'therubyracer'

gem 'odbc_adapter'

配置 database.yml

vi config/database.yml

配置内容如下:

development:

adapter: odbc

dsn: odsn

username: sysdba

password: szoscar55

安装依赖

bundle install

启动 rails 应用

rails server

访问 rails 应用

在浏览器中输入 localhost:3000,显示如下界面:

../../../../_images/demo.png

查阅数据库,发现新增连接如下,此时就可以基于Rails开发神通数据库应用系统了:

../../../../_images/demo1.png

oscar-enhanced部署

oscar-enhanced简介

除了上一节中rails框架通过odbc-adapter连接神通数据库,这节将介绍种更简便的方式连接,通过oscar-enhanced连接神通数据库。目前oscar-enhanced方言包适配了rails5、rails6、rails7

在rails中安装神通数据库的oscar-enhanced方言,神通oscar-enhanced方言依赖ruby-aci开发接口,ruby-aci接口依赖ACI接口。rails部署oscar-enhanced方言后,并且rails的数据库后台配置为神通数据库,即可进行连接神通数据库等操作,调用逻辑如下:

../../../../_images/logicDiagram.png

部署前提

序号 必须组件 版本要求 默认安装路径
1 Ruby >=2.7.0  
2 Rails 支持rails4.2、rails5.2、rails6.0、rails7.0 $RUBY_HOME/lib/ruby/gems/x.x.x/gems/rails-x.x.x
3 oscar-enhanced 主、子版本号应与rails的主、子对应 $RUBY_HOME/lib/ruby/gems/x.x.x/gems/activerecord-oscar_enhanced-adapter-x.x.x
4 Ruby-staci >2.2.9 $RUBY_HOME/lib/ruby/gems/x.x.x/gems/ruby-staci-x.x.x
5 Aci >2.0.49 $SZ_OSCAR_HOME/bin/

oscar-enhanced安装

  1. 编译: 进入到$SZ_OSCAR_HOME/drivers/ruby-aci/orm/rails-x/oscar-enhanced目录,执行 gem build activerecord-oscar_enhanced-adapter.gemspec
  2. 安装: gem install activerecord-oscar_enhanced-adapter-x.x.x.gem

rails配置oscar-enhanced

修改 Gemfile 文件

添加下列之一需要的方言版本:

gem "activerecord-oscar_enhanced-adapter", "~> 1.6"
gem "activerecord-oscar_enhanced-adapter", "~> 5.2.1"
gem "activerecord-oscar_enhanced-adapter", "~> 6.0.0"
gem "activerecord-oscar_enhanced-adapter", "~> 7.0.0"

配置 database.yml

default: &default
  adapter: oscar_enhanced
  username: SYSDBA
  database: OSRDB
  password: szoscar55
  host: 192.168.114.1
  port: 2003
  encoding: utf8
development:
  <<: *default
  database: OSRDB

注解

当运行rails4、rails5、rails6时,可能会遇到报错: cannot load such file – staci, 需要把ruby-staci库加入到RUBYLIB环境变量里 如: SET RUBYLIB=D:\Ruby27-x64\lib\ruby\gems\2.7.0\gems\ruby-staci-2.2.9\lib

数据类型

rails和oscar-enhanced方言支持的数据类型和数据库数据类型以及ruby类型的对应关系如下表:

rails/oscar-enhanced方言类型 数据库数据类型 Ruby类型 备注
:binary BLOB String  
:boolean NUMERIC TrueClass/FalseClass  
:date DATE Time  
:datetime TIMESTAMP Time  
:decimal FLOAT Float  
:float NUMERIC Float  
:integer NUMERIC Integer  
:string VARCHAR String  
:text CLOB String  
:time TIMESTAMP Time  
:timestamp TIMESTAMP Time  

模型创建

创建表结构

示例:

bin/rails generate model Article tstring:string ttext:text tdecimal:decimal tfloat:float tinteger:integer tbinary:binary tboolean:boolean tdate:date tdatetime:datetime ttime:time ttimestamp:timestamp

上述命令生成的迁移文件(dbmigrate20230714082322_create_articles.rb)内容如下:

class CreateArticles < ActiveRecord::Migration
  def change
    create_table :articles do |t|
      t.string :tstring
      t.text :ttext
      t.decimal :tdecimal
      t.float :tfloat
      t.integer :tinteger
      t.binary :tbinary
      t.boolean :tboolean
      t.date :tdate
      t.datetime :tdatetime
      t.time :ttime
      t.timestamp :ttimestamp

      t.timestamps
    end
  end
end

添加字段

bin/rails generate migration AddNewcolToArticles newcol: string

注解

上面的命令只是生成迁移文件,并未在数据库中生成数据

数据迁移

bin/rails db:migrate

数据表删除

bin/rails destroy model Article

数据操作

增加数据

示例:

article = Article.new(
tbinary: "\0\1\2\3\4\5\6\7\8\9" * 10000,
tboolean: false,
tdate: Time.local(2008, 5, 26),
tdatetime:Time.local(2008, 5, 26, 23, 11, 11, 0),
tdecimal: 4.40125,
tfloat: 1.23456,
tinteger: 12,
tstring: "tstringtstring中文",
ttext: "ttextttextttextttextttext中文",
ttime:Time.local(2008, 5, 26, 23, 11, 11, 0),
ttimestamp: Time.local(2008, 5, 26, 23, 11, 11, 0)
)
article.save

查询数据

查询所有数据

Article.all

条件查询

Article.find(1)

更新数据

a1 = Article.find(1)
a1.update({tboolean:0})

a1 = Article.find(1)
a1.update({tboolean: 1, tstring: "更新", ttext: "更新更新更新ttext ", tinteger: 13, tdate: Time.local(2023, 5, 26)})

删除数据

示例:

a1 = Article.find(1)
a1.destroy