Перевод модели с помощью Globalize2 (rails)
-
03-07-2019 - |
Вопрос
Я использую последнюю версию globalize2 и rails 2.2.Интересно, является ли следующее ошибкой или особенностью:похоже, что для получения перевода существует отдельный запрос к базе данных для каждого элемента в наборе данных.Это звучит неправильно, поскольку это может легко привести к сотням запросов.
Иллюстрация.Простой контроллер:
def index
@menu_sections = MenuSection.find(:all)
end
Затем @menu_sections зацикливается в представлении, где вызывается локализованный атрибут (name):
<% @menu_sections.each do |menu_section| %>
<p><%= link_to menu_section.name, :controller => 'store', :action => 'list_menu_items_for_section', :section_id => menu_section.id %></p>
<% end %>
Выглядит как каждый раздел menu_section.название приводит к запросу в БД:
Processing StoreController#index (for 10.0.2.2 at 2009-03-02 16:05:53) [GET] Session ID: 468f54928cbdc0b19c03cfbd01d09fa9 Parameters: {"action"=>"index", "controller"=>"store"} MenuSection Load (0.0ms) SELECT * FROM `menu_sections` Rendering template within layouts/store Rendering store/index Rendered application/_js_includes (0.0ms) MenuSection Columns (0.0ms) SHOW FIELDS FROM `menu_sections` MenuSectionTranslation Load (0.0ms) SELECT * FROM `menu_section_translations` WHERE (`menu_section_translations`.menu_section_id = 1 AND (`menu_section_translations`.`locale` IN ('en','root'))) MenuSectionTranslation Columns (0.0ms) SHOW FIELDS FROM `menu_section_translations` MenuSectionTranslation Load (0.0ms) SELECT * FROM `menu_section_translations` WHERE (`menu_section_translations`.menu_section_id = 2 AND (`menu_section_translations`.`locale` IN ('en','root'))) MenuSectionTranslation Load (0.0ms) SELECT * FROM `menu_section_translations` WHERE (`menu_section_translations`.menu_section_id = 3 AND (`menu_section_translations`.`locale` IN ('en','root'))) Completed in 340ms (View: 320, DB: 0) | 200 OK [http://www.dev.babooka.com/store]
А ты как думаешь?Возможно, есть лучший способ перевода данных БД в rails?
Решение
Вы можете добиться того, что пытаетесь сделать, сказав что-то вроде:
def index
@menu_sections = MenuSection.find(:all,:include=>:globalize_translations)
end
Это приведет к быстрой загрузке переводов, так что будет всего 2 запроса.
Другие советы
Я не знаю, нравится ли вам этот вопрос.Но я столкнулся с той же проблемой.Я перевожу только один столбец таблицы (скажем, заголовок).Если у меня есть 100 строк в таблице, и если я выполняю подобный запрос для данной локали:
строки = Категория.найти(: все, .....)
Это приведет к 101 запросу к базе данных !!Я не уверен, ожидаемо ли это или задумано разработчиком Globalize.
ИЛИ я чего-то не хватает (например, необязательного параметра конфигурации в запросе).
Однако я нашел альтернативное решение Саймона Мура, который внедрил альтернативную реализацию переводов Globalize Model.Вы можете прочитать об этом по адресу:
http://saimonmoore.net/2006/12/1/alternative-implementation-of-globalize-model-translations
Однако я не могу найти никаких ссылок, работает ли это с Globalize2.
Я нахожусь на грани того, чтобы выбросить плагин Globalize2 и запустить свое собственное решение, используя библиотеку Ruby I18N.