16 Stimmen

Wie ordne ich eine Abfrage nach einem übersetzten Feld mit globalize

Ich versuche, eine Abfrage mit einem Feld zu bestellen, das mit globalize2 übersetzt wird. Das Problem ist, dass seit der Speicherung in der Datenbank und in einer Vereinigung habe ich viele Probleme.

  • Einfügen der Übersetzungen und Bestellung nach category_translations.name funktioniert nicht.
  • Ich habe versucht, ein default_scope, aber da es nicht zulässt, Lambda oder einen Block für die Bedingungen verwenden, kann ich nicht bekommen es funktioniert, es sei denn, ich diesen Patch für ActiveRecord verwenden http://gist.github.com/81187
  • Ich habe es mit dem with_translations definiert in globalize2, aber ich bekomme einen Fehler mit diesem und ich konnte nicht bekommen, es zu arbeiten, auch ohne Bestellung.

Ich habe etwas Ähnliches

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

  translates :name
end

Die Frage ist, wie kann ich nach dem übersetzten Namen bestellen?

13voto

rebagliatte Punkte 1982

El with_translations Methode scheint der richtige Weg zu sein:

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

Wenn Sie PostgreSQL verwenden, sollten Sie außerdem die Groß- und Kleinschreibung nicht berücksichtigen:

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

Mehr dazu hier: https://github.com/globalize/globalize#scoping-objects-by-those-with-translations

1voto

aceofspades Punkte 7510

Ich habe dies mit sqlite3 getestet, und es funktioniert.

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

1voto

edgerunner Punkte 14594

Ich gehe davon aus, dass jedes Modell namens Category würde höchstens Hunderte von Datensätzen haben, wenn nicht weniger. Vielleicht können Sie in Erwägung ziehen, die Ergebnisse im Speicher zu sortieren, nachdem Sie sie abgerufen haben.

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

Aber Vorsicht. Dies wäre eine schlechte Idee, wenn die categories Tabelle enthält mehr als Tausende von Datensätzen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X