8

私が見た問題の本質

ある日、間違いがなければ、named_scope を再利用して別の named_scope を定義する例を見たことがあります。このようなもの(正確な構文を思い出せませんが、それはまさに私の質問です):

named_scope :billable, :conditions => ...
named_scope :billable_by_tom, :conditions => {
    :billable => true, 
    :user => User.find_by_name('Tom')
}

問題は、可能な場合、正確な構文は何ですか? 私はそれを取り戻すことができず、Google も役に立ちませんでした。

いくつかの説明

私が実際にそれを望んでいるのは、Searchlogic を使用して複雑な検索を定義しているためです。これにより、次のような式が得られる可能性があります。

Card.user_group_managers_salary_greater_than(100)

しかし、どこにでも置くには長すぎます。私の知る限り、Searchlogic はその場で named_scopes を定義するだけなので、次のように Card クラスに named_scope を設定したいと思います。

named_scope from_big_guys, { user_group_managers_salary_greater_than(100) }

- これは、named_scope 内で長い Searchlogic メソッドを使用する場所です。しかし、繰り返しになりますが、構文はどうなるでしょうか? それを理解することはできません。

履歴書

では、named_scope の入れ子 (連鎖という意味ではありませ) は実際に可能ですか?

4

5 に答える 5

8

proxy_optionsを使用して、1 つの 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:52:10.687 に答える
2

ここSOで以前に提起されたこの質問を参照してください。あなたの要件を達成するために灯台にパッチがあります。

于 2010-03-15T03:49:07.653 に答える
2

レール 3+

これと同じ質問がありましたが、幸いなことに、過去 5 年間で Rails コア チームはスコープ部門で大きな進歩を遂げました。

Rails 3 以降では、ご想像のとおり、これを実行できるようになりました。

scope :billable,        where( due: true )
scope :billable_by_tom, -> { billable.where( user: User.find_by_name('Tom') ) }

Invoice.billable.to_sql         #=> "... WHERE due = 1 ..."
Invoice.billiable_by_tom.to_sql #=> "... WHERE due = 1 AND user_id = 5 ..."

参考までに、Rails 3+ に名前を変更named_scopeしましたscope。Ruby 1.9 構文も使用しています。

ボーナス ラウンド: 一般的なスコープ。

「Tom」だけでなく「請求可能」な人が複数いる場合は、ブロックに渡される名前パラメーターを受け入れる汎用スコープを作成すると便利な場合があります。

scope :billable_by, lambda { |name| billable.where( user: User.find_by_name( name ) ) }

次に、次のように呼び出すことができます。

Invoice.billable_by( "Tom" ).to_sql #=> "... WHERE due = 1 AND user_id = 5 ..."

lambdaところで、ボーナス ラウンドで古い構文を使用したことがわかります。これは、param を渡すと、新しい構文がひどく見えると思うからです: ->( name ) { ... }

于 2015-04-13T14:01:26.577 に答える
0

メソッドを使用して、次のような named_scope を組み合わせることができます。


def self.from_big_guys
  self.class.user_group_managers_salary_greater_than(100)
end

この機能は Rails 3 に新しい構文で追加されました ( http://m.onkey.org/2010/1/22/active-record-query-interface )

于 2010-03-14T20:39:00.650 に答える