という名前の範囲を選択できるように、私は名前のスコープを持っていますparams[:scope] = 'random'
のGETリクエスト。ユーザーがGETのparamsを経由して私のポストモデルで
eval("Post.#{params[:scope]}")
の短絡はどうすればいいですか?
という名前の範囲を選択できるように、私は名前のスコープを持っていますparams[:scope] = 'random'
のGETリクエスト。ユーザーがGETのparamsを経由して私のポストモデルで
eval("Post.#{params[:scope]}")
の短絡はどうすればいいですか?
。これにはsearchlogicが最適です。
ユーザーからのデータを扱っているので、私はevalから離れています。たぶんシンプルなケースステートメントを使用しますか?こうすることで、彼らがあなたに与えているデータを検証することができます。
私は非常に素晴らしいacts_as_filterプラグインを、named_scopesを使用してユーザー主導の結果フィルタリング用に設計しました。
http://github.com/tobyhede/acts_as_filter/tree/master
評価は、使用する罰金です - (?私は、多くの場合、単にアレイとテストaccepted_values.includeにいくつかの値をプラグ(パラメータ))が、あなたは受け入れ/期待値に対して検証を確認してください
のevalかなり悪い考えです。しかし、#sendはこれには完璧です。本質的に安全で、evalよりも速い(私が理解しているように)。それを行う必要があります:)に
をあなたが与える例えば
Product.send(params[:scope])
、私はあなたが欲しいクエリを作成するために一緒に明示すること、およびチェーンスコープたい:
scope = Post
scope = scope.random if params[:scope] == 'random'
@posts = scope.find(:all, ...) # or paginate or whatever you need to do
のparams場合は[ :scope]はランダムではありません。これはPost.find()を呼び出すのと同じです。そうでなければPost.random.find()を実行します。
find_by_filterはかなり役に立ちます同じくらい薄いあなたのためにg。
このパターンを使用すると、相互に排他的でないものをサポートする必要がある場合は、複数のスコープをクエリに組み合わせることもできます。 ?
scope = scope.only_monsters if params[:just_monsters] == 1
scope = scope.limit(params[:limit].to_i) unless params[:limit].to_i.zero?
だから、取得/ポストスコープ=ランダム& just_monsters = 1つの&制限= 5はあなたを与えるだろう:私は検索でそれに出くわした
Post.random.just_monsters.limit(5).find(:all, ...)