Frage

In meiner Rails 3.2.8-App habe ich einige benannte Bereiche, die ich unter bestimmten Umständen verketten möchte.

So habe ich zum Beispiel diese beiden Bereiche:

scope :by_status, lambda { |status| if status == "All" then WorkRequest.all else WorkRequest.find_all_by_status(status) end }
scope :in_date_range, lambda { |start_date, end_date| includes([:person, :pier_module]).where("(status_date >= ?) AND (status_date <= ?)", start_date, end_date) }

Ich benutze sie separat, aber ich würde sie auch gerne so zusammenrufen können:

WorkRequest.by_status("Accepted").in_date_range("2012-01-01", "2012-10-02")

Wenn ich das versuche, beschwert es sich, dass in_date_range keine Array-Methode ist.

Aber ich habe einen anderen Bereich,

scope :active, includes([:person, :pier_module]).where("status = 'New Request'")

und wenn ich es tue

WorkRequest.active.in_date_range("2012-01-01", "2012-10-02")

es funktioniert!Anscheinend gibt der aktive Bereich eine Beziehung zurück, während die Lambda-Bereiche Arrays zurückgeben und daher nicht verkettet werden können.

Ich würde gerne wissen, warum der Unterschied zwischen einfacheren Bereichen und Lambda-Bereichen besteht, wie sich die Parameter darauf auswirken und ob ich etwas tun kann, außer einen kombinierten Bereich zu schreiben, was ich getan habe.

scope :by_status_in_date_range, lambda { |status, start_date, end_date|  includes([:person, :pier_module]).where("(status = ?) AND (status_date >= ?) AND (status_date <= ?)", status, start_date, end_date) }

Funktioniert, aber nicht sehr TROCKEN (da ich auch die einzelnen Zielfernrohre brauche) oder schienenartig.Bei der Suche hier und anderswo habe ich ähnliche Fragen gesehen, aber keine, die auf diese Situation zuzutreffen scheinen, in der ich versuche, zwei Lambdas mit Parametern zu verketten.

War es hilfreich?

Lösung

Das passiert, weil in Ihrem Bereich

scope :by_status, lambda { |status| if status == "All" then WorkRequest.all else WorkRequest.find_all_by_status(status) end }

metoden all und find_all_by_status zurückgeben Array statt ActiveRecord::Relation.Sie sollten es ersetzen durch where beispielsweise.

scope :by_status, lambda { |status| where(:status => status) unless status == "All" }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top