i18n-active_record PG ::错误:错误:关系“翻译”不存在(rails 4)

时间:2014-01-26 11:26:11

标签: ruby-on-rails activerecord ruby-on-rails-4 rails-i18n

我对Rails中的gem有一点问题。我已经安装了i18n-active_record gem(使用rails 4和ruby 2)。在我的宝石文件中

    gem 'i18n-active_record',
        :git => 'git://github.com/svenfuchs/i18n-active_record.git',
        :require => 'i18n/active_record'

这也需要模型翻译,所以我有一个模型和一个迁移

    class CreateTranslations < ActiveRecord::Migration
      def self.up
        create_table :translations do |t|
          t.string :locale
          t.string :key
          t.text   :value
          t.text   :interpolations
          t.boolean :is_proc, :default => false

          t.timestamps
        end
      end

      def self.down
        drop_table :translations
      end
    end

现在我可以运行bundle install,并安装gem。但是,如果我尝试运行rake db:migrate,我会收到错误

    PG::Error: ERROR:  relation "translations" does not exist (and some other stuff)

在我的本地服务器上,我首先运行迁移,然后将gem添加到gemfile并运行bundle install。但是gem不能在gemfile中,因为如果它不能运行rake migrate,因为gem文件不是最新的。

但是现在我想在Heroku(或任何其他服务器)上推送它,我真的不想每次都这样做。我有办法绕过这个循环吗?

修改

我在github上得到了答案。我只需要这样做:

    require 'i18n/backend/active_record'

    if ActiveRecord::Base.connection.table_exists? 'translations'
      I18n.backend = I18n::Backend::ActiveRecord.new

      I18n::Backend::ActiveRecord.send :include, I18n::Backend::Memoize
      I18n::Backend::ActiveRecord.send :include, I18n::Backend::Flatten
      I18n::Backend::Simple.send :include, I18n::Backend::Memoize
      I18n::Backend::Simple.send :include, I18n::Backend::Pluralization

      I18n.backend = I18n::Backend::Chain.new I18n::Backend::Simple.new, I18n.backend
    end

1 个答案:

答案 0 :(得分:1)

我已解决此问题我需要在初始化程序中添加if表(locale.rb)

  require 'i18n/backend/active_record'

    if ActiveRecord::Base.connection.table_exists? 'translations'
      I18n.backend = I18n::Backend::ActiveRecord.new

      I18n::Backend::ActiveRecord.send :include, I18n::Backend::Memoize
      I18n::Backend::ActiveRecord.send :include, I18n::Backend::Flatten
      I18n::Backend::Simple.send :include, I18n::Backend::Memoize
      I18n::Backend::Simple.send :include, I18n::Backend::Pluralization

      I18n.backend = I18n::Backend::Chain.new I18n::Backend::Simple.new, I18n.backend
    end