Как заказать запрос по переведенному полю с помощью globalize - PullRequest
15 голосов
/ 30 августа 2010

Я пытаюсь заказать запрос, используя поле, которое переводится с globalize2. Проблема в том, что, поскольку хранится в базе данных и в ассоциации, у меня много проблем.

  • Включение переводов и упорядочение по category_translations.name не работает.
  • Я попробовал default_scope, но поскольку он не позволяет использовать лямбда или блок для условий, я не могу заставить его работать, если я не использую этот патч для ActiveRecord http://gist.github.com/81187
  • Я пробовал с with_translations, определенным в globalize2, однако я получаю сообщение об ошибке и не могу заставить его работать даже без заказа.

У меня что-то подобное

class Category < ActiveRecord::Base
  validates_presence_of :name
  validates_uniqueness_of :name
  has_many :products, :dependent => :destroy

  translates :name
end

Вопрос в том, как заказать по переведенному названию?

Ответы [ 3 ]

13 голосов
/ 13 октября 2014

Метод with_translations кажется правильным:

Category.with_translations(I18n.locale).order('category_translations.name')

Кроме того, если вы используете PostgreSQL, вы можете добавить к этому регистр без учета регистра:

Category.with_translations(I18n.locale).order("LOWER(category_translations.name) ASC")

Подробнее об этом здесь: https://github.com/globalize/globalize#scoping-objects-by-those-with-translations

1 голос
/ 29 января 2011

Я предполагаю, что любая модель с именем Category будет иметь не более сотен записей, если не меньше.Возможно, вы можете рассмотреть сортировку результатов в памяти после их извлечения.

@categories = Category.all # or whatever else to retrieve what you want
@categories.sort! { |a,b| a.name <=> b.name }

Осторожно, хотя.Это станет плохой идеей, если таблица categories содержит более тысячи записей.

1 голос
/ 11 сентября 2010

Я проверил это с помощью sqlite3, и он работает.

class Category < ActiveRecord::Base
  ...
  named_scope :ordered, lambda {|locale|
    {
      #:select => "categories.*, categories.name sort_name",
      # For MySQL
      #:select => "categories.*, IF(category_translations.name IS NULL, categories.name, category_translations.name) sort_name",
      # For sqlite3
      :select => "categories.*, (CASE WHEN category_translations.name IS NULL THEN categories.name ELSE category_translations.name END) sort_name",
      :joins => ActiveRecord::Base.sanitize_sql_array([
        "LEFT JOIN category_translations on category_translations.category_id = categories.id AND category_translations.locale = ?", locale]),
      :order => "sort_name"
    }
  }
  ...
end

Category.ordered(some_locale).all # Returns all records, sorted by translated name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...