i18n поиск с использованием шин и Globalize3

У меня есть сайт, использующий гем globalize3 (https://github.com/svenfuchs/globalize3), и в настоящее время я добавляю камень Tire для поиска по сайту.

Как мне сделать, чтобы проиндексировать перевод таблицы в зависимости от фактической локали? в настоящее время индексируемая модель работает только с локалью по умолчанию.

1 ответ

Решение

Вы должны проиндексировать все переводы:

class Centre < ActiveRecord::Base
  include Tire::Model::Search
  include Tire::Model::Callbacks

  mapping do
    indexes :title_en, :as => lambda { |post| I18n.locale = :en; post.title }
    indexes :title_es, :as => lambda { |post| I18n.locale = :es; post.title }
    indexes :title_jp, :as => lambda { |post| I18n.locale = :jp; post.title }
  end

end

Это может стать громоздким, если вы поддерживаете много языков для множества атрибутов, вам, возможно, придется прибегнуть к метапрограммированию:

class Centre < ActiveRecord::Base
  include Tire::Model::Search
  include Tire::Model::Callbacks

  mapping do
    %w[en it jp].each do |locale|
      %w[title text].each do |attribute|
        class_eval<<-RUBY
          indexes :#{attribute}_#{locale}, :as => lambda { |post| I18n.locale = :#{locale}; post.#{attribute} }
        RUBY
      end
    end
  end

end

Я не тестировал приведенный выше код, это просто для того, чтобы дать представление, поэтому убедитесь, что вы понимаете его, и он работает, прежде чем использовать его в своем проекте, в противном случае BAD THINGS WILLUPEN™.

Другие вопросы по тегам