Ruby:Rails:MRI和JRuby

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选择适配器?

Nic*_*ger 7

您可以在database.yml文件中使用ERB:

development:
  adapter: <%= defined?(JRUBY_VERSION) ? "mysql" : "mysql2" %>
  ...
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!我最终选择了适配器:<%= RUBY_ENGINE =="jruby"?"mysql":"mysql2"%> (2认同)