日期:2014-05-16  浏览次数:20527 次

rails应用与多数据库的连接
rails与多数据库的连接有插件模式,也有原生模式,本文参考互联网资料,总结出来,并实际连接成功
1、配置database.yml
development:
  adapter: mysql
  encoding: utf8
  database: myapp
  username: root
  password:
  host: localhost

test:
  adapter: sqlite3
  database: db/test.sqlite3
  pool: 5
  timeout: 5000

production:
  adapter: mysql
  encoding: utf8
  database: myapp
  username: root
  password:
  host: localhost

typo:
    adapter: mysql
    database: typo
    username: root
    password:
    host: localhost
说明:
1、typo是外部数据库,这是一个rails安装之后就存在的一个实例应用的库;
2、其他的development、test、production都是缺省的主数据库,这是缺省配置;
3、yml文件的书写方式非常严格,typo描述部分的下面各个参数必须采用tab的方式对齐,在netbeans中可以识别此格式,如果格式不对,将提示错误。

二、编写一个外部库的基础模型类
创建external_data.rb这个模型类
class ExternalData < ActiveRecord::Base
  self.abstract_class = true
  establish_connection :typo
end
说明:
1、self.abstract_class = true,表示这个模型类不会与库中的任何表有关系,也就是一个抽象的类。
2、establish_connection :typo,就是配置连接

三、编写一个具体的模型类
下面是typo库的表
+---------------------+
| Tables_in_typo      |
+---------------------+
| articles            |
| articles_categories |
| blacklist_patterns  |
| categories          |
| comments            |
| page_caches         |
| pages               |
| pings               |
| resources           |
| schema_info         |
| sessions            |
| settings            |
| sidebars            |
| trackbacks          |
| users               |
+---------------------+
我们随便选择一个如,pages,实现它的模型;
创建文件page.rb,内容如下:
class Page<ExternalData
end
说明:
1、关键在于page这个类是从刚才定义的抽象类ExternalData中继承而来,有一个好处是这个抽象类下衍生出来的各个模型类可以共用连接池,减少数据库连接的消耗。
2、这种采用继承的方式非常方便创建其他表对应的类,不需要在模型中重复书写establish_connection :typo这样的语句。比如对settings这个表,创建setting.rb模型类文件,代码如下:
class Setting<ExternalData
end
与缺省库中的模型操作起来一样,不一样的就是父类不同而已。

四、测试看看是否成功
ruby script/console
>> ExternalData
=> ExternalData(abstract)
>> Page
=> Page(id: integer, name: string, title: string, body: text, body_html: text, text_filter: string, user_id: integer, created_at: datetime, updated_at: datetime)
>> Setting
=> Setting(id: integer, name: string, value: string)

没有问题。







1 楼 boobmoom 2011-02-28  
This is helpful to me.
Thanks for your article.
2 楼 tw208 2011-03-30  
3 楼 cyberblue 2011-03-30  
文档上推荐的写法很麻烦

ActiveRecord::Base.esta