论坛首页 编程语言技术论坛

也来说说rails 和sqlserver 的相关问题和心得

浏览 9718 次
该帖已经被评为良好帖
作者 正文
   发表时间:2009-09-01   最后修改:2009-09-01

 虽然大家都在说rails不适合在windows平台上用,不适合连接在sqlserver上用,但是本着无聊加上老板不关心你用什么语言的情况下,

我把 ruby on rails用在了我们自己部门的信息系统上。

 

先截个图给大家看看样子吧。

 



 正如大家所说,用rails连在sqlserver2000上一点都不好玩。

 

先说sqlserver适配器和编码问题。

首先,链接适配器就是很痛苦的事情。rails1.2以后的版本就不自带sqlserver的适配器了。

而直接能 gem install sqlserver_adapter 出来的那个适配器也有问题,不能很好的解决中文字符编码的问题。

之前看过一些文章的解决,在环境配置里面把字符集设置为UTF8,在sqlserver2000里面把字段类型配置成nvarchar。

 

但是很遗憾,我们部门的数据库有很多遗留的表格,很多是和公司级的系统对接的,不能随便更改字段类型,所以必须留着以前的varchar。

 

也有人说用rails 2.+ 的版本,把rails1.2 里面的sqlserver适配器 和 ADO拷贝过去放在相应的文件夹。

这个方法可以参见http://swifthorse.iteye.com/blog/59776

这样做的问题很快就暴露出来了,在做数据迁移的时候就会有很大的问题。

而且必须更改适配器中的一些字符类型到数据库字段类型的转换才可以使用。

我用了一段时间,但是问题不断,于是就放弃了。

 

在google找了很长时间,无意中找到一个sqlserver 2000的适配器。

很惊奇的发现这个适配器可以很好的处理中文,并且不需要在环境配置里设置成UTF8, GB2312就可以很好的工作,并且数据库的

字段类型也可以使用varchar,于是一直用了下来。

 

这个adapter 和 ado 都放在附件里了,有需要的同学可以自己下载。

 

再说EXCEL导入和导出问题。

我们部门会用到大量的EXCEL数据导入和导出的工作。

曾经尝试过一些插件,roo 也用过,效果都不理想。

 

导入的时候都报错说不能将string转换成int, 我想这大概是适配器的问题,研究了一段时间,没有成功。

曾经详细研究过夜鸣猪的这个帖子 http://hlee.iteye.com/blog/356507

各种插件也用过,也重点研究了'win23ole',大概是因为适配器的原因,都没成功。能导入导出,但是编码问题没有解决。

 

最后放弃了使用rails导入导出excel,继续使用了asp,在rails 的 view 里使用框架来引用。

不过说实在的,在windows sqlserver 上,使用asp来导入导出excel要比rails 方便很多很多。

 

又特别是导出,rails在调整导出的excel格式是非常麻烦的事情。

大家可以看一下 lmxbitihero 的这个帖子 http://lmxbitihero.iteye.com/blog/334032

 

写了那么多。

 

在ASP下面,是需要用一个网页,让其显示成需要导出的格式样子,再加一段

<%Response.AddHeader "Content-Disposition", "attachment; filename=file.xls"%>

就可以实现了。

 

所以我选择了使用asp到导入导出EXCEL,虽然看起来有点山寨,不过非常好用。

 

至于在rails中实现导出,大家可以看上面的这个截图,导出excel的按钮的地方有一个表单,用隐藏域存放了rails生成的sql语句,然后把这个sql语句提交给一个excel页面,就可以处理了。

 

所有需要生成excel的地方都指向这个ASP页面,SQL不同就导出了不同的数据。

 

FIND 和 FIND_BY_SQL

义无反顾的使用了大量的find_by_sql,肯定有人会说这样玩RAILS还有什么意思。但我也没办法,表名都叫什么 T_I2_SHIPMENT_BY_DAY 之类的,

你说我怎么去把表明和谐成符合规范的或者用映射(这一点上有待继续研究)。

另外一些查询相对一般WEB应用来说,要复杂得多,我贴一个例子吧。

 

select top 20 * from ( SELECT a.matnr AS mtm, a.kwmeng AS shipment, a.subgeo AS subgeo, 
a.itemdesc AS itemdesc, a.series, b.country, b.DISPLAY, b.Technics, b.Chipset_North_Bridge, b.Chipset_South_Bridge, 
b.Graphics, b.CPU, b.Memory1, 
b.Memory2, b.Hard_Disk_1, b.Hard_Disk_2, b.Wireless_Card, b.Optical, b.OS, b.Battery, 
b.Bluetooth FROM (SELECT matnr, subgeo, itemdesc, SUM(kwmeng) AS kwmeng,series FROM 
t_i2_shipment_by_days WHERE (matnr like '59%' or matnr like '%cto%') and shipdate>='2009-08-28' 
and shipdate<='2009-09-01' GROUP BY matnr, subgeo,series, itemdesc ) a LEFT JOIN t_por b 
ON a.matnr = b.pn union all select mtmso,sum(kwmeng) as kwmeng,subgeo,itemdesc,series,''
,lcd,'','','','',cpu,memory,'',harddisk,'',mini,'',os,'','' from t_i2_shipment_cto_days where 
shipdate>='2009-08-28' and shipdate<='2009-09-01' GROUP BY mtmso,odd,itemdesc,cpu,memory,
harddisk,mini,os,lcd,subgeo,series)c where c.mtm not in (select top 0 mtm from ( SELECT a.matnr AS mtm, 
a.kwmeng AS shipment, a.subgeo AS subgeo, a.itemdesc AS itemdesc, a.series, b.country, 
b.DISPLAY, b.Technics, b.Chipset_North_Bridge, b.Chipset_South_Bridge, 
b.Graphics, b.CPU, b.Memory1, b.Memory2, b.Hard_Disk_1, b.Hard_Disk_2, b.Wireless_Card,
 b.Optical, b.OS, b.Battery, b.Bluetooth FROM (SELECT matnr, subgeo, itemdesc, SUM(kwmeng) 
AS kwmeng,series FROM t_i2_shipment_by_days WHERE (matnr like '59%' or matnr like '%cto%') 
and shipdate>='2009-08-28' and shipdate<='2009-09-01' GROUP BY matnr, subgeo,series, itemdesc )
 a LEFT JOIN t_por b ON a.matnr = b.pn union all select mtmso,sum(kwmeng) as kwmeng,subgeo,itemdesc,series,'',l
cd,'','','','',cpu,memory,'',harddisk,'',
mini,'',os,'','' from t_i2_shipment_cto_days where shipdate>='2009-08-28' and shipdate<='2009-09-01'
 GROUP BY mtmso,odd,itemdesc,cpu,memory,
harddisk,mini,os,lcd,subgeo,series)d order by d.mtm) order by c.mtm 

  这是一个带翻页语法的最终生成的SQL语句,我实在不想把这玩意儿翻译成find方法来弄。

基于这两个原因,我部分使用了find_by_sql语句。

 

最后说分页

 

刚开始我也是用了will_paginate来分页,但是发现效果不对,不论翻到哪一些东西都是一样的。

后来上网查了一些资料,貌似说sqlserver 对 will_paginate的支持不好,木有 limit 这样的语法(未详细了解)。

 

后来在csdn上看到了一种分页的方法,于是按照那样的原理,在rails上实现了一下。

 

我的做法是,由will_paginate来生成试图上的页码和翻页提交ID,由find_by_sql来实现翻页的数据显示。

    sql_text=session[:sql]
    limit=20
    offset=limit*(params[:id]|| 1).to_i-limit
    sql_pass="select top #{limit} * from (#{sql_text})c  where c.mtm not in (select top #{offset} mtm from (#{sql_text})d order by d.mtm) order by c.mtm"
    shipment=Shipment.find_by_sql(sql_pass)
    shipment2=Shipment.paginate_by_sql(sql_text,:page =>params[:id] , :per_page =>"20")
    @shipment=shipment
    @shipment2=shipment2

 @shipment 在试图上用来显示数据(我承认这个名字叫@shipments更合适)

@shipment2用于在视图上显示页码,生成页码链接。

这样就可以很好的工作了,或许有人会说这样就执行了两次查询,不过没事,我们部门人不多,服务器尚且算好,这点小东西没什么影响。

 

目前这个系统也还在继续开发中,其中的心得体会也希望能够和大家继续交流。

 

此外我自己下班后也在做一些小型的WEB项目,就是玩玩,顺便学学CSS 和 RAILS,其中就不使用这边这么山寨的方法了。

有机会也希望能够更多的和大家交流。恩。

 

写完了~累死了~

 

  • 大小: 120.7 KB
   发表时间:2009-09-02  
1.Rails的确不太适合跑在windows上.
2.Rails的确不太适合试用Sql server
3.Rails的确不太适合处理遗留系统(非rails遗留系统)

三样都占齐了, 楼主还是坚决选择Rails. 佩服佩服....
感谢楼主的经验分享....  要不再谈谈部署?
0 请登录后投票
   发表时间:2009-09-02   最后修改:2009-09-02
poshboytl 写道
1.Rails的确不太适合跑在windows上.
2.Rails的确不太适合试用Sql server
3.Rails的确不太适合处理遗留系统(非rails遗留系统)

三样都占齐了, 楼主还是坚决选择Rails. 佩服佩服....
感谢楼主的经验分享....  要不再谈谈部署?


我们在linux+oracle+rails外接一个sqlserver,用dbi来操作的,
用的unixODBC+freeTDS+ruby-odbc+dbi搞定了。不可否认,有时候是迫不得已的

除了sqlserver_adapter,还有odbc-rails这样的方案,不过由于交互不多,还是选择dbi方便快捷

关于excel导入,可以选择使用spreadsheet,roo也是用着它,只要弄弄
require 'spreadsheet'
Spreadsheet.client_encoding = 'GBK//IGNORE'
暂时还算运行ok
至于导出,我们一般选择xml的excel格式,配置一下headers,选择xx.xls.erb来渲染即可。基本还是能出来的。
0 请登录后投票
   发表时间:2009-09-02   最后修改:2009-09-02
poshboytl 写道
1.Rails的确不太适合跑在windows上.
2.Rails的确不太适合试用Sql server
3.Rails的确不太适合处理遗留系统(非rails遗留系统)

三样都占齐了, 楼主还是坚决选择Rails. 佩服佩服....
感谢楼主的经验分享....  要不再谈谈部署?



此人不怀好意,没劲。

什么是不适合,搞不出来就是不适合,得到想要的结果就是适合。
所谓的不适合的那些原因,什么编码之类的,我到目前为止都还解决得不错。

正如mccxj所说,有些时候是迫不得已。

面对着一个轻量级的部门系统,你要我用它原来的ASP继续写下去?

与其无聊到死,还不如弄点新花样学点东西,有什么不好,老板也可以继续得到他要的东西。

你不喜欢rails连在sqlserver上就别看这个帖子,但总有人需要这样做。
0 请登录后投票
   发表时间:2009-09-02  
mccxj 写道


我们在linux+oracle+rails外接一个sqlserver,用dbi来操作的,
用的unixODBC+freeTDS+ruby-odbc+dbi搞定了。不可否认,有时候是迫不得已的

除了sqlserver_adapter,还有odbc-rails这样的方案,不过由于交互不多,还是选择dbi方便快捷

关于excel导入,可以选择使用spreadsheet,roo也是用着它,只要弄弄
require 'spreadsheet'
Spreadsheet.client_encoding = 'GBK//IGNORE'
暂时还算运行ok
至于导出,我们一般选择xml的excel格式,配置一下headers,选择xx.xls.erb来渲染即可。基本还是能出来的。


学习中~~~
0 请登录后投票
   发表时间:2009-09-02  
rails适合Web前端开发,我现在比较倾向于把遗留系统变成service,然后用消息系统集成,那样比较容易
0 请登录后投票
   发表时间:2009-09-02  
fsword 写道
把遗留系统变成service


请问这个是什么意思
0 请登录后投票
   发表时间:2009-09-02  
ywencn 写道
fsword 写道
把遗留系统变成service


请问这个是什么意思


就好像提供web service接口,或者rest之类方式来调用,这样使用通用的数据交换格式,就不用为了去理解遗留系统那些XXXX。
不过有时候不是那么如意,有些人就给出数据库访问方式,让你自己去取数据,我们就是这样才用linux+ruby去折腾sqlserver
0 请登录后投票
   发表时间:2009-09-02  
mccxj 写道
ywencn 写道
fsword 写道
把遗留系统变成service


请问这个是什么意思


就好像提供web service接口,或者rest之类方式来调用,这样使用通用的数据交换格式,就不用为了去理解遗留系统那些XXXX。
不过有时候不是那么如意,有些人就给出数据库访问方式,让你自己去取数据,我们就是这样才用linux+ruby去折腾sqlserver


原来还能这样,看来还需要多加学习呀。
0 请登录后投票
   发表时间:2009-09-02  
ywencn 写道
poshboytl 写道
1.Rails的确不太适合跑在windows上.
2.Rails的确不太适合试用Sql server
3.Rails的确不太适合处理遗留系统(非rails遗留系统)

三样都占齐了, 楼主还是坚决选择Rails. 佩服佩服....
感谢楼主的经验分享....  要不再谈谈部署?



此人不怀好意,没劲。

什么是不适合,搞不出来就是不适合,得到想要的结果就是适合。
所谓的不适合的那些原因,什么编码之类的,我到目前为止都还解决得不错。

正如mccxj所说,有些时候是迫不得已。

面对着一个轻量级的部门系统,你要我用它原来的ASP继续写下去?

与其无聊到死,还不如弄点新花样学点东西,有什么不好,老板也可以继续得到他要的东西。

你不喜欢rails连在sqlserver上就别看这个帖子,但总有人需要这样做。

其实poshboytl说的没错。建议楼主研究一下怎么开汽车爬楼梯,虽然平地上开车比走路快。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics