公司内部有多个系统,现在一个新系统用 rails 来写,需要用到其他系统的数据,想用 rails 将其他系统用到的数据进行封装为 restful 的 api,新系统通过 Activeresource 来访问其他系统的数据。 目前是想通过 ActvieRecord 直接访问原数据库,mysql 是可以访问成功的,访问 sqlserver2008 的时候貌似就没有连接上,大家有没有相关资料推荐一下?
Build your own api::Activeresource
. The #find
, #save
etc actions are actually making api calls.
如果对数据访问性权限不是那么敏感的话,也可以在新系统中直接配置多个数据源,直接用 activerecord 访问旧数据,这样做好处是减少数据 marshal 的消耗,毕竟读取数据封装 json 快不过直连数据库,缺点自然是直接暴露数据库,权限什么的没法控制,看项目需要了
#2 楼 @alucardpj 恩,现在就是通过 ActiveRecord 直接访问数据,测试时用的 mysql 数据可以访问到, 不过原数据库使用的是 sqlserver2008,貌似就没有连接上
只是访问 sqlserver 数据的话,我用这个 https://rubygems.org/gems/tiny_tds
查询数据的话在 Model 里写几个方法就可以了,如果想要用 ActiveRecord 的 Api,这个方法还不行。
正好我们一个项目就是用了 mysql 和 sql server。
Gem 用
gem "tiny_tds", "~> 0.6.1"
gem 'activerecord-sqlserver-adapter', "~> 4.2.4" #看SQL Server的版本
database.yml
development:
adapter: mysql2
database: my_app_dev
host: localhost
reconnect: true
username: root
password:
pool: 5
encoding: utf8
mssql_development: &development_mssql_base
adapter: sqlserver
username: *****
password: *****
port: 1433
tds_version: 80 #看 SQL Server的版本
login_timeout: 60
timeout: 5
encoding: utf8
class SqlServerBaseModel < ActiveRecord::Base
self.abstract_class = true
establish_connection(:mssql_development)
end
app/models
class User < ActiveRecord::Base
# 默认连 mysql
end
class AnotherModel < SqlServerBaseModel
#链接的是 SQL Server
end
init/speed_up_sql_server.rb
# 加上下面的内容会执行 SQL语句更快,否则大量查询时, SQL Server会出现性能问题。
# Speed up SQL Server Query
ActiveRecord::ConnectionAdapters::SQLServer::DatabaseStatements.class_eval do
def execute_sp_executesql(sql)
proc_name = "sp_executesql #{quote(sql)}"
result = execute_procedure(proc_name)
return result
end
def execute_sp_executesql_noexception(sql)
begin
execute_sp_executesql(sql)
rescue => e
return nil
end
end
def select(sql, name = nil, binds = [])
exec_query(sql, name, binds)
end
end