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接口。
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程序员开发手册。
数据库连接测试¶
安装以下组件¶
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
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的数据库后台配置为神通数据库,即可进行连接神通数据库等操作,调用逻辑如下:
部署前提¶
| 序号 | 必须组件 | 版本要求 | 默认安装路径 |
|---|---|---|---|
| 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安装¶
- 编译: 进入到$SZ_OSCAR_HOME/drivers/ruby-aci/orm/rails-x/oscar-enhanced目录,执行 gem build activerecord-oscar_enhanced-adapter.gemspec
- 安装: 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 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
更新数据¶
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)})