Frage

Ich habe

class Foo < ActiveRecord::Base
  named_scope :a, lambda { |a| :conditions => { :a => a } }
  named_scope :b, lambda { |b| :conditions => { :b => b } }
end

Ich würde gerne

class Foo < ActiveRecord::Base
  named_scope :ab, lambda { |a,b| :conditions => { :a => a, :b => b } }
end

aber ich würde es lieber trocken machen.Ich kann den gleichen Effekt erzielen, indem ich verwende

 Foo.a(something).b(something_else)

aber besonders schön ist es nicht.

War es hilfreich?

Lösung

Nun, ich bin noch ein Rail-Neuling und weiß nicht genau, was Sie hier beabsichtigen, aber wenn Sie nur die Wiederverwendung von Code anstreben, warum nicht eine reguläre Klassenmethode verwenden?


        def self.ab(a, b)
            a(a).b(b)
        end
    

Sie könnten dies flexibler gestalten, indem Sie *args anstelle von a und b verwenden und dann möglicherweise das eine oder andere optional machen.Wenn Sie bei „named_scope“ nicht weiterkommen, können Sie es dann nicht erweitern, um fast das Gleiche zu tun?

Lassen Sie mich wissen, wenn ich mit dem, was Sie tun möchten, völlig daneben liege.

Andere Tipps

Spätestens seit 3.2 gibt es eine clevere Lösung:

scope :optional, ->() {where(option: true)}
scope :accepted, ->() {where(accepted: true)}
scope :optional_and_accepted, ->() { self.optional.merge(self.accepted) }

Indem Sie es zu einer Klassenmethode machen, können Sie es nicht an einen Assoziations-Proxy verketten, wie zum Beispiel:

@category.products.ab(x, y)

Eine Alternative ist die Bewerbung diesen Patch So aktivieren Sie eine :through-Option für „named_scope“:

named_scope :a, :conditions => {}
named_scope :b, :conditions => {}
named_scope :ab, :through => [:a, :b]

Ja Wiederverwendung von „named_scope“, um ein anderes „named_scope“ zu definieren

Der Einfachheit halber kopiere ich es hier:

Sie können „proxy_options“ verwenden, um einen benannten Bereich in einen anderen umzuwandeln:

class Thing
  #...
  named_scope :billable_by, lambda{|user| {:conditions => {:billable_id => user.id } } }
  named_scope :billable_by_tom, lambda{ self.billable_by(User.find_by_name('Tom').id).proxy_options }
  #...
end

Auf diese Weise kann es mit anderen benannten_Bereichen verkettet werden.

Ich verwende dies in meinem Code und es funktioniert perfekt.

Ich hoffe, es hilft.

@PJ:Weißt du, ich hatte darüber nachgedacht, es aber verworfen, weil ich dachte, dass ich es später nicht schaffen würde, eine Kette anzuhängen dritte benannter Bereich, etwa so:

Foo.ab(x, y).c(z)

Aber seit ab(x, y) gibt alles zurück b(y) Ich würde wiederkommen, ich denke, die Kette würde funktionieren.Eine Möglichkeit, mich dazu zu bringen, das Offensichtliche zu überdenken!

Kasse:

http://github.com/binarylogic/searchlogic

Beeindruckend!

Um genau zu sein:

class Foo < ActiveRecord::Base
  #named_scope :ab, lambda { |a,b| :conditions => { :a => a, :b => b } }
  # alias_scope, returns a Scope defined procedurally
  alias_scope :ab, lambda {
    Foo.a.b
  }
end
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top