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™.