3 Stimmen

Dynamisches `named_scope` je nach bestimmten Kriterien

Liebe alle, ich habe ein Student Modell, in dem ich einige name_scope spezifiziert habe, z.B. from_program, from_year, from_school, has_status, from_course usw...

Gibt es eine Möglichkeit, die verschiedenen named_scope dynamisch je nach bestimmten Kriterien zur Laufzeit zu verketten?

Zum Beispiel, wenn der Benutzer, der auf die Daten zugreift, aus dem Finanzbereich stammt, möchte ich nur from_school und has_status verketten können. Wenn der Benutzer der Dozent ist, möchte ich from_course und from_school verketten können, und so weiter...

Sollte ich named_scope verwenden? Oder sollte ich einfach auf die gute alte Art und Weise zurückgreifen und Bedingungen angeben?

Vielen Dank im Voraus für Ihre Vorschläge! =) Übrigens, ich benutze Rails 2.3

5voto

santuxus Punkte 3602

Ich bin mir nicht sicher, ob ich es verstanden habe, aber ich denke, du könntest etwas Ähnliches tun:

class Student

  named_scope from_program, lambda{|program| :conditions => {:program => program}}
  named_scope from_year, lambda{|year| :conditions => {:year => year}}
  named_scope has_status, lambda{|status| :conditions => {:status => status}}

  def self.from_finance(school, status)
    self.from_school(school).has_status(status)
  end

end

oder allgemeiner

def self.get_students(params)
  scope = self
  [:program, :year, :school, :course].each do |s|
    scope = scope.send("from_#{s}", params[s]) if params[s].present?
  end
  scope = scope.has_status(params[:status]) if params[:status].present?
  scope
end

2voto

Ashish Punkte 5648

Sie können etwas Ähnliches versuchen

  Klasse Benutzer erweitern ActiveRecord::Base
  gehört zu :semester

  named\_scope :jahr, lambda { |\*jahr|
    if jahr.empty? || jahr.first.nil?
      { :joins => :semester, :conditions => \["jahr = #{CURRENT\_SEMESTER}"\]}
    else
      { :joins => :semester, :conditions => \["jahr = #{jahr}"\]}
    end
    }

  end

Sie können es so aufrufen

  Benutzer.jahr     # standardmäßig Konstante CURRENT\_SEMESTER
  Benutzer.jahr()  # das gleiche wie oben
  Benutzer.jahr(nil)  # das gleiche wie oben; nützlich, wenn ein Parameterwert übergeben wird, der möglicherweise existiert oder nicht, z. B. param\[:jahr\]
  Benutzer.jahr(2010)

Auf die gleiche Weise können Sie Parameter übergeben

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