i18n поиск с использованием шин и Globalize3 - PullRequest
2 голосов
/ 31 марта 2012

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

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

1 Ответ

0 голосов
/ 13 мая 2012

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

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

Я не тестировал приведенный выше код, это просто для того, чтобы дать представление, поэтому убедитесь, что вы понимаете его, и он работает, прежде чем использовать его в своем проекте, в противном случае ПЛОХИЕ ВЕЩИ БУДУТ ПРОИЗОЙТИ.

...