2011-01-02 8 views
0

私は次のようにモデルにwhere()を呼び出すことによって、クエリを検索できることを承知している: Post.where(:title => 'My First Post')Rails3で検索を実行するにはどうすればよいですか?

しかし、私は、ユーザーが検索パラメータをフィルタリングしたい場合何がわからない場合は? たとえば、オプションのtitleフィールドを持つ検索フォームがあります。タイトルが記入されている場合、フォームはタイトルを検索する必要があります。しかし、そうでなければ、フォームはすべてのフィールドを返すだけです。

私はPost.allを呼び出すと、私はさらに条件/

を追加することはできません、私はどのように行うのですかしかし、Railsのimmidiatelyは、検索の結果を返す

search = Post.all 
if params[:title].present? 
    search.where(:title => params[:title]) 
end 

の線に沿って何かをやってみました

この?

ありがとうございます!ここでチェーンへの関係のように、あまりないです、本当に、三項演算子を持つシンプルなワンライナーが行う可能性があることをそこに思われることを考えると

答えて

1

.allは、arelの「フィニッシャー」メソッドであり、実際に呼び出されるようにします(同じことが.each.first)。したがって、スコープを条件付きで構築し続けることができるようにしたい場合は、.allが呼び出された最後のものである必要があります。

+0

次にフィールドを取得せずにリソースを取得すると、条件を呼び出すことができます。ありがとう! –

+0

1つのオプションは、 'search = Post.unscoped'または' search = Post.scoped'を設定することです。これはあなたに再生するarel関係を残します。また、条件付きでスコープを追加する方法を再考し、モデルでより適切に対処しようとします。 – idlefingers

1

@posts = params[:title].present? ? Post.where(:title => params[:title]) : Post.all 

...そこ理由いいえです:where句スコープ、あなたは後でチェーン化できませんでした:とにかく、すべて。

+0

右ですが、これは単なる例です。ユーザーの入力に応じてここで5つの異なる条件を呼び出す必要があるかもしれないと想像してください。 '.all'を呼ぶことなくリソースを取得するにはどうすればいいのですか?ありがとう! –

+0

だから、あなたはpost_query = Post.scopedで始まり、次にこのベーススコープの上に構築することができます。 post_query = post_query.where(:title => params [:title])など – Scott

関連する問題