Jay*_*dse 2 ruby mysql ruby-on-rails jruby
我已经在Ubuntu 11.04上将我的Rails 3.0.10/MRI应用程序移植到Ubuntu 11.04上的JRuby 1.6.4.我的目标是到达一个我必须执行以下操作才能在JRuby下运行应用程序的地方.
railsapp1> rbenv local jruby-1.6.4
railsapp1> rails server
Run Code Online (Sandbox Code Playgroud)
并让应用程序在MRI下工作,
railsapp1> rbenv local 1.9.2-p290
railsapp1> rails server
Run Code Online (Sandbox Code Playgroud)
这个问题的第一部分是解决宝石问题.为了使这个过程在没有代码更改的情况下工作,我在Rails Gemfile中执行了以下操作
platforms :mri do
gem 'mysql2', '~>0.2.11'
end
platforms :jruby do
gem 'jruby-openssl'
gem 'activerecord-jdbcmysql-adapter'
end
Run Code Online (Sandbox Code Playgroud)
这些gem语句是通过使用不同的MRI/JRuby和SQLite/MySQL组合创建虚拟轨道应用程序,然后从生成的Gemfiles中为每个组合获取gem语句而使用暴力方法获得的.
尽管如此,这并不是很好.我的config/database.yml文件如下所示:
development:
adapter: mysql2
database: doodad
username: doodad
password: doodad
host: localhost
Run Code Online (Sandbox Code Playgroud)
此config/database.yml文件仅适用于MRI版本.对于JRuby版本,config/database.yml文件如下所示:
development:
adapter: mysql
database: doodad
username: doodad
password: doodad
host: localhost
Run Code Online (Sandbox Code Playgroud)
即文件之间的唯一区别是数据库适配器的名称(mysql vs mysql2).有没有办法告诉database.yml文件或系统初始化程序根据Ruby环境是MRI还是JRuby选择适配器?
您可以在database.yml文件中使用ERB:
development:
adapter: <%= defined?(JRUBY_VERSION) ? "mysql" : "mysql2" %>
...
Run Code Online (Sandbox Code Playgroud)