Ich habe eine E-Commerce-Anwendung in der Entwicklung, ich versuche, mich mit dem folgenden Problem zu beschäftigen: Ich habe meine Kategorien durch das awesome_nested_set-Plugin realisiert. Wenn ich meine Artikel durch die Auswahl einer Kategorie aufliste, funktioniert alles gut, aber für einige Links möchte ich alle Produkte einer Kategorie und die Produkte ihrer Unterkategorien anzeigen.
Hier ist der Controller-Code, der nur mit einer Kategorie funktioniert:
%Vor%Die Zeile, die ich auskommentiert habe, ist eine Hilfsmethode, die ich selbst in das Kategoriemodell geschrieben habe, die alle Produkte der Kategorie und ihrer untergeordneten Kategorien in einem Array zurückgibt.
Es ist wie folgt definiert:
%Vor%Wenn ich jetzt diese Zeile auskommentiere und versuche, eine Kategorie auszuwählen, bricht mein Produkt-Controller-Code mit Fehlern wie
ab %Vor%oder
%Vor%weil ich Bestellung und Paginierung verwende und die Ariere nicht mehr bestellen kann.
Gibt es Ideen, wie Sie alle Produkte in einem ActiveRecord-Beziehungselement in meinem Controller abrufen können? Danke
AKTUALISIEREN
also, wenn ich Folgendes benutze:
%Vor% und fragen Sie den Controller für @category.all_products
Ich bekomme den folgenden Fehler:
Wie bekomme ich alle Produkte mit dieser Konstellation?
UPDATE 2
Ok, also werde ich ein Kopfgeld beginnen.
Wenn ich es versuche:
Def all_products Categorization.find (: alle,: conditions = & gt; {: category_id = & gt; branch_ids}) Ende
Ich bekomme wieder undefined method
order 'für #'
Ich muss wissen, wie ich alle Produkte einer many_to_many Beziehung als eine ActiveRecord Beziehung erhalten kann.
UPDATE 3
Ich habe den relevanten Code in einen Kern eingefügt Ссылка
Der Schlüssel mit awesome_nested_set ist die Verwendung eines Bereichs in der Spalte lft . Hier ist ein Codebeispiel, wie ich es mit einer direkten Assoziation mache (Kategorie has_many articles)
%Vor%Dann irgendwo in einem Controller
%Vor%das findet alle Artikel in den Kategorien Äpfel, Orangen, Bananen usw. Sie sollten diese Idee mit einem Beitritt zu Kategorisierungen anpassen (aber sind Sie sicher, dass Sie hier eine Viele-zu-Viele-Beziehung brauchen?)
Jedenfalls würde ich das versuchen:
%Vor%Lass es mich wissen, wenn es irgendwelche Probleme gibt
Es gibt mehrere Möglichkeiten, wie Sie Ihren Code verbessern können. Wenn Sie jedoch nach allen Produkten suchen, die zu einer Kategorie gehören, und zu Kindern (Nachkommen) der Kategorie, dann werden Sie dies nicht so tun:
%Vor%Ich habe hier einige Annahmen gemacht, aber ich hoffe, Sie haben die Idee.
Erweitern wir die Antwort von charlysisto, wenn Sie sich mit has_and_belongs_to_many
categories beschäftigen, werden Sie bald feststellen, dass die Brute-Force-Perspektive ziemlich langsam ist ... Sie brauchen eine Art "Middleware", um es schneller zu machen ...
Die Antwort von socjopata gibt einen guten Ansatz, wie dies verbessert werden kann. Also, Sie verwenden die Definition
%Vor% in Ihrer category.rb
-Datei (Modell).
Dann zum Beispiel in Ihrem Controller (Beispiel mit Paginierung):
%Vor% Schließlich, Ihrer Ansicht nach, benötigen Sie eine kleine "Technik", um Paginierung zu haben. Sie paginieren auf @prodcats
, nicht auf @products
...
Dieser Ansatz ist viel schneller, Wenn ich mich mit many_to_many
befasse, obwohl ich nicht 100% politisch korrekt bin, muss ich zugeben.
Tags und Links ruby ruby-on-rails-3 ruby-on-rails activerecord nested-sets
Endlich habe ich ein paar Workarounds / Lösungen ausgearbeitet.
1) Von Ссылка sieht es aus, als könnte das in Sass-Rails behoben werden. Ich habe Helfer geplappert. Ich richte mich nach dem vorgeschlagenen Patch im obigen Link. Ich habe einfach die erforderliche Umgebungsvariable in der Asset-Vorkompilierungszeile in %code% festgelegt.
Ich mache alle meine Affe-Patches in einer einzigen Datei %code% . In dieser Datei habe ich diese Methode wie folgt gepatcht:
%Vor%2) Wenn Sie Bilder in das CSS einbetten möchten, ändern Sie das Stylesheet mit der Erweiterung .erb und ersetzen Sie %code% durch %code% , ohne dass sass-rails geändert werden müssen. %code% existiert nicht als reine Sass-Funktion, daher müssen Sie den Rails-Helfer %code% verwenden.
In den neuesten Rails 3.1.3 müssen Sie jetzt ein anderes Modul installieren, damit es funktioniert
Das habe ich gemacht
%Vor%Und in meinem deploy.rb habe ich:
%Vor%Ich bin dabei, eine Rails 3-App zu aktualisieren, um Rails 3.1 zu verwenden, und benutze dabei die neue Asset-Pipeline. Bis jetzt habe ich alles außer einem ziemlich nervigen Problem, das ich nicht lösen kann.
Die Anwendung und alle ihre Assets funktionieren in der Entwicklung gut, aber in der Produktion wird sie mit Passenger ( %code% ) in einen Sub-URI deployed. Das Problem dabei ist, dass die Assets während der Bereitstellung vorkompiliert werden und eine meiner CSS-Dateien (nun, es ist eine %code% -Datei) den %code% -Helfer aus dem %code% -Element nutzt. Da die Pfade während der Vorkompilierung in der vorkompilierten CSS-Datei fest codiert sind, wird die Sub-URI nicht berücksichtigt:
In meiner %code% Datei:
%Vor%Das Ergebnis in der kompilierten %code% -Datei:
%Vor%Was sollte es sein, damit es richtig funktioniert:
%Vor%Ist dieses Szenario nur zu viel verlangt? Wenn das der Fall ist, muss ich auf den alten, nicht auf Assets basierenden Weg zurückwechseln und meine Bilder und CSS nur von %code% aus bedienen. Es scheint jedoch etwas zu sein, über das nachgedacht und gelöst werden sollte ...? Fehle ich die Lösung?
Edit 1: Ich sollte das mit der Erb-Lösung liefert stattdessen das gleiche Ergebnis, wie man es erwarten würde.
Edit 2: als Antwort auf Benoit Garrets Kommentar
Nein, das Problem hängt nicht mit %code% zusammen. Ich habe versucht, dies zu setzen (auf %code% anstatt auf den Standardwert %code% ), aber es stellte sich heraus, dass das falsch war - es scheint, dass diese Einstellung bereits mit dem Stamm der Rails-App zusammenhängt, nicht mit dem Server . Das zu entfernen (und somit zum Standard zurückzukehren) hat all die seltsamen Probleme behoben, die verursacht haben (und es gab viele, alle Assets wurden in %code% gelandet - es war alles sehr seltsam). Das einzige Problem ist, dass die %code% Helfer und Freunde den Sub-URI nicht übernehmen, wenn sie vorkompiliert sind. Unnötig zu sagen, dass dies logisch ist, da es, wenn es vorkompiliert ist, nicht wissen kann, dass es, wenn es unter Passenger läuft, auf diese Weise konfiguriert wird. Meine Frage ist, wie ich es darüber informieren soll und damit die richtigen Pfade im vorkompilierten Ergebnis erhalten. Wenn es tatsächlich möglich ist.
Meine aktuelle Problemumgehung besteht darin, die CSS-Datei wie folgt zu referenzieren: %code% und in den nicht-pipelinierten Speicherort %code% zu platzieren. Kaum ideal, da es nicht vom Fingerabdruck und allem, was die Pipeline bietet, profitiert.
Nachdem ich ein bisschen gegraben habe, habe ich das Problem gefunden. Das Problem tritt in Rails auf, insbesondere in Ritzels :: Helpers :: RailsHelper :: AssetPaths # compute_public_path. Rinkets :: Helpers :: RailsHelper :: AssetPaths erbt von ActionView :: AssetPaths und überschreibt eine Reihe von Methoden. Wenn compute_public_path über die Methode sass :: Rails :: Resolver # public_path aufgerufen wird, ist der racks rack helper die Aufgabe, das Asset aufzulösen. Rippets :: Helpers :: RailsHelper :: AssetPaths # compute_public_path wird auf Super verteilt, was ActionView :: AssetPaths # compute_public_path ist. In dieser Methode gibt es eine Bedingung von has_request? auf rewrite_relative_url_root wie unten zu sehen:
%Vor%Wenn Sie sich die Interna von rewrite_relative_url_root ansehen, hängt es von einer Anforderung ab, dass sie vorhanden ist, und der Fähigkeit, sie von der Controller-Variablen abzuleiten, um den relativen URL-Root aufzulösen. Das Problem ist, dass wenn Rakete diese Ressourcen für Sass auflöst, es keinen Controller vorhanden hat und daher keine Anfrage.
Die obige Lösung funktionierte für mich im Entwicklungsmodus nicht. Hier ist die Lösung, die ich verwende, um es für jetzt zu arbeiten:
%Vor%Ich verwende Rails 3.1.3 und setze erfolgreich einen Sub-URI ein. Ich habe nichts gepatcht.
Die Hauptprobleme bei diesem Setup wurden hier besser besprochen. Wie Sie sehen können, wurde die Lösung auf Rails 3.2 angewendet und niemals nach 3.1.4 zurückgeliefert.
Aber ich bin zu einer Lösung gekommen, die Rails 3.1.3 verwendet, die für meine Einrichtung funktioniert.
Probieren Sie Folgendes aus: (Ich bin kein Experte, versuche nur einen Beitrag zur Lösung eines Problems zu leisten, das mich stundenlang belästigt hat ...)
environment.rb:
%Vor%production.rb:
%Vor%routes.rb:
%Vor%Wie Sie sehen können, habe ich assets.prefix in production.rb und nicht in application.rb abgelegt Danach tun Sie:
%Vor%und als, Test mit der Konsole:
%Vor%Ergebnisse:
%Vor%