about 4 years ago

因為之前有專案需求, 所以用到RoR連Mysql又要連MSSQL, 在這邊稍微做記錄.

step.1 linux/mac os要安裝freetds

$ brew install freetds # for mac os
$ sudo apt-get install freetds-dev freetds-bin tdsodbc # for Ubuntu

step.2 rails app 安裝兩個 gem

Gemfile
gem "tiny_tds"
gem "activerecord-sqlserver-adapter"

step.3 在專安目錄中 bundle install

$ bundle install

如果出現

Errno::EACCES: Permission denied - /Users/luckily/.rvm/gems/ruby-2.0.0-p195/gems/tiny_tds-0.6.1/.gitignore
An error occurred while installing tiny_tds (0.6.1), and Bundler cannot
continue.
Make sure that `gem install tiny_tds -v '0.6.1'` succeeds before bundling.

…的錯誤的話, 就把權限全開…

輸入:

$ sudo chmod -R 777 /Users/luckily/.rvm/gems/ruby-2.0.0-p195/gems/tiny_tds-0.6.1
$ sudo chmod -R 777 /Users/家目錄/.rvm/gems/目前RVM正在使用的ruby版本/gems/目前已安裝的tiny_tds目錄

step.4 設定 database.yml

其實RoR要多資料庫連線也很簡單, 正常情況下, 執行環境還是會預設連線development/production, 如果要讓model取得mssql資料的話, 就必須寫在model, 範例如下:

config/database.yml
mssql:

  adapter: sqlserver # 不要更動

  mode: dblib # 不要更動

  database: mssql_database_name 

  host: 127.0.0.1

  encoding: utf8

  username: user_name

  password: "pwd"

  port: 1433


development:

  adapter: mysql2

  database: database_name

  host: localhost

  encoding: utf8

  username: root

  password: "pwd"

step.5 然後開始建model

一樣按照慣例, 一張table對一個model.

我的作法是會再寫一個父類別, 讓所有mssql專用的model來繼承他就好, 那支父類別只做連線mssql的事

app/models/mssqlserver_connecter.rb
# -*- encoding : utf-8 -*-

class MssqlserverConnecter < ActiveRecord::Base
    # 所有sqlserver的model都繼承這支.

    establish_connection "mssql"
end
app/models/mssql_product.rb
# -*- encoding : utf-8 -*-

class MssqlProduct < MssqlserverConnecter
    # 手動設定資料表跟PK, 因為外連的資料庫通常不會按照Rails慣例.

    set_table_name "Product"
    set_primary_key "no" 
end

可以rails c試試看, 跟ORM操作一模一樣, 但可能會有小雷(太複雜的ORM可能會失敗, 但幾乎都可以用!)
MssqlProduct.first

done.

← Rails 多層 includes、joins 安裝前laravel的注意事項 →