2016-07-28 6 views
0

Dies ist keine Hausaufgabe. Ich versuche mehr zu lernen.Bestellung von A dann B mit Ruby on Rails Modell

Ich habe folgende Entitäten mit Attributen
Manufacturer {name} // Shop manufactueres
Model {manufacturer_id, name} // Speichere Models
Tint {manufacturer_id, model_id, front, side, rear} // Speichere Messungen

Ich habe die Folgedaten in meiner Tint Einheit. Alphabete steht für verschiedene Herstellernamen und Modelle.

Manufacturer | Model | Front | Side | Rear | 
-------------+-------+-------+------+------- 
A   | AD | 10 | 10 | 10 | 
B   | AB | 10 | 10 | 10 | 
A   | AA | 10 | 10 | 10 | 
A   | AC | 10 | 10 | 10 | 
B   | AA | 10 | 10 | 10 | 
A   | AB | 10 | 10 | 10 | 

Wenn ich es in view auszudrucken, ich möchte es basierend auf Manufacturer Namen haben sortiert und dann Model. Also wird das Ergebnis wie folgt sein. Der Name der Hersteller wird alphabetisch sortiert, dann Modelle.

Manufacturer | Model | Front | Side | Rear | 
-------------+-------+-------+------+------- 
A   | AA | 10 | 10 | 10 | 
A   | AB | 10 | 10 | 10 | 
A   | AC | 10 | 10 | 10 | 
A   | AD | 10 | 10 | 10 | 
B   | AA | 10 | 10 | 10 | 
B   | AB | 10 | 10 | 10 | 

Ich habe Setup das Modell, um sicherzustellen, Manufacturer und Model ein deutliches Wertepaar ist.

Meine Frage ist, da ich Referenzierung bin mit manufacturer_id und model_id, wie kann ich den Namen der Manufacturer und Model von Manufacturer und Model Tisch.

In meiner tints_controller.rb habe ich @tints = Tint.all.order(:manufacturer_id). Es wird jedoch nur auf der Grundlage der manufacturer_id (wie in Zahlen) anstelle des Namens des Herstellers sortiert.

Ich weiß, dass ich es in SQL Weise (SELECT, FROM, WHERE) in RoR-Modell tun kann. Ich würde jedoch gerne wissen, ist es möglich, ActiveRecord zu verwenden, um die Daten basierend auf ihrem Namen zu sortieren.

Antwort

0

Antwort auf meine Frage:

In tints_controller.rb, ich @tints = Tint.joins(:manufacturer, :model).order("manufacturers.name ASC, models.name ASC") schrieb den Tisch zu setzen und befehle sie entsprechend.

Ich versuchte die Antwort von @Goston oben zur Verfügung gestellt und ich hatte ein Problem, als ich versuchte, die tints bearbeiten. Es erlaubte mir nicht zu bearbeiten.

Hinweis: Beantwortet durch @Goston wird sie bestellen, aber es brach die edit Funktion für meinen Fall.

0

Sie haben jederzeit die id eines Unternehmens in Rails, Sie leicht andere zugehörige Felder einfach durch Instanziieren das betreffende Unternehmen abrufen können:

@manufacturer = Manufacturer.find(params[manufacturer_id]) 

Dann ist es eine einfache Sache, alle anderen Felder abzurufen:

@manufacturer_name = @manufacturer.name 

Wenn Sie eine Sammlung von Herstellern oder Herstellernamen benötigen, dann ist es ratsam, sich ein ActiveRecord::Relation Objekt sofort über eine scoped Abfrage erstellen (wie Sie bereits wissen). Ich habe keine Ahnung, was Ihre Kriterien sind, sonst würde ich einen Beispielcode liefern. Ich kann Ihnen sagen, dass Ihre scoped Abfrage eine .order Klausel am Ende umfassen sollte:

@manufacturers = Manufacturer.where("some_column = ?", some_criterion).order(:sort_field) 

In dem obigen Beispiel :sort_field würde das Feld sein, indem Sie Ihre ActiveRecord::Relation sortieren möchten. Ich vermute in deinem Fall ist es :name.

All dies wurde gesagt, wenn Sie Lust sortierte Tabellen möchten, sollten Sie in den Edelstein JQuery DataTables schauen. DataTables kann eine Menge des Schwergewichts für Sie erledigen, und es ist bequem für Ihre Benutzer, weil sie dann sortieren und nach jeder Spalte sortieren können, die Sie präsentieren.

+0

Ich bekomme völlig, was Sie sagen wollen, aber ich bin etwas verloren. Ich weiß, dass ich '@ manufacturer.name' machen kann, um den Namen des Herstellers zu erhalten. Da ich in "Tint" -Controller bin, wie kann ich den folgenden Code einbetten, indem ich "@ tints = Tint.all.order (: manufacturer_id)" ändere. Ich habe versucht, das in der letzten Stunde herauszufinden, aber ich bin immer noch verloren. –

2

Wenn ich richtig verstehe, haben Sie 3 Modelle, Farbton, Hersteller und Modell.Ich nehme an, Sie haben die richtige has_many und gehört zu associations Setup richtig.

Tint.rb 
belongs_to :workspace 

Manufacturer.rb 
has_many :models 
has_many :tints, through: :models 

Model.rb: 
belongs_to Manufacturer 
has_many :tints 

Sie müssen zuerst zusammen die drei Modelle verbinden, und dann, um nach einigen Kriterien

tints_controller.rb 
@tints = Tint.joins(model: :manufacturer).order('manufacturers.name, models.name').pluck('manufacturers.name, models.name, tints.front, tints.side, tints.rear') 

, dass Sie alle Farbtöne Aufzeichnungen geben und sie sachgemäßer Modelle und Hersteller.

+0

Ja, Sie verstehen die Frage richtig und ich habe die folgenden Beziehungen in meinem Modell. Ich versuche jedoch, SQL-Join zu vermeiden. –

0

In Ihrem tints_controller.rb, instedad von

@tints = Tint.all.order(:manufacturer_id) 

bitte schreiben:

@tints = Tint.all.order(:manufacturer_id, :model_id) 
+0

Ich habe dies gestern versucht, das funktioniert nicht, da es nur die ID anstelle des Namens des Modells und des Herstellers sortieren wird. –