7

私は持っている

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

私は…したい

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

しかし、私はドライな方法でそれを行うことを好みます. を使用して同じ効果を得ることができます

 Foo.a(something).b(something_else)

しかし、それは特に素敵ではありません。

4

6 に答える 6

2

私はまだレールに慣れていないので、ここで何をしようとしているのか正確にはわかりませんが、コードを再利用するだけなら、通常のクラス メソッドを使用してみませんか?


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

a と b の代わりに *args を使用して、より柔軟にすることができます。その後、どちらかをオプションにすることができます。named_scope に行き詰まっている場合は、それを拡張してほとんど同じことを行うことはできませんか?

あなたがやりたいことと私が完全にずれている場合はお知らせください。

于 2008-08-27T17:50:49.600 に答える
1

はいnamed_scopeを再利用して別のnamed_scopeを定義します

私はあなたの便宜のためにそれをここにコピーします:

proxy_optionsを使用して、あるnamed_scopeを別のnamed_scopeにリサイクルできます。

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

このようにして、他のnamed_scopesとチェーンすることができます。

私はこれをコードで使用しており、完全に機能します。

お役に立てば幸いです。

于 2010-07-20T12:53:57.280 に答える
1

クラスメソッドにすることで、次のように関連付けプロキシにチェーンできなくなります。

@category.products.ab(x, y)

別の方法として、このパッチを適用して、named_scope の :through オプションを有効にします。

named_scope :a, :conditions => {}
named_scope :b, :conditions => {}
named_scope :ab, :through => [:a, :b]
于 2009-05-11T10:24:35.703 に答える
0

@ PJ :ご存知のとおり、私はそれを検討していましたが、後で3番目の名前付きスコープにチェーンすることはできないと思ったので却下しました。

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

しかし、戻ってab(x, y)くるものは何でも返すのでb(y)、チェーンは機能すると思います。私に明白なことを再考させる方法!

于 2008-08-27T18:08:52.457 に答える
0

チェックアウト:

http://github.com/binarylogic/searchlogic

印象的!

具体的には:

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
于 2010-09-08T23:04:51.077 に答える