2016-03-18 2 views
0

これは私のコードです:インデックスページの場所とリストのカテゴリをフィルタリングしたいですか?

def index 
if params[:category].blank? 
    @listings = Listing.all.order("created_at DESC") 
else 
    @category_id = Category.find_by(name: params[:category]).id 
    @listings = Listing.where(:category_id => @category_id).order("created_at DESC") 
end 


if params[:location].blank? 
    @listings = Location.all.order("created_at DESC") 
else 
    @category_id = Location.find_by(name: params[:location]).id 
    @listings = Listing.where(:location_id => @location_id).order("created_at DESC") 
end 

エンド

+0

あなたの質問が正確であるかどうかは完全にはわかりません。問題文を含めることはできますか?コードに関しては、 '@ location_id'がどこに定義されているのかわかりませんが、これは問題になります。私はあなたが2番目の条件でそれを定義することを意味すると思います....このコードをリファクタリングする助けを求めていますか? –

+0

実際に問題があるのは、私が場所によってリスティングを探したいとき、それはうまくいかないということです。私はカテゴリー別にリストを見つけることができます –

答えて

0

あなたはカテゴリ名や場所名、またはその両方で選択したい場合は、条件付きで、同じコレクションにwhere条件を適用することができます。

category_idまたはlocation_idをビューで使用しない限り、インスタンス変数にする必要はありません。

#tryを使用して、カテゴリ/ロケーションテーブルに一致するものがない場合は、カテゴリ/ロケーションからid値を取得することに注意してください。

def index 

    @listings = Listing.all.order("created_at DESC") 

    if params[:category].present? 
    category_id = Category.find_by(name: params[:category]).try(:id) 
    @listings = @listings.where(category_id: category_id) if category_id 
    end 

    if params[:location].present? 
    location_id = Location.find_by(name: params[:location]).try(:id) 
    @listings = @listings.where(location_id: location_id) if location_id 
    end 

end 
+0

これは多少の欠陥があります。 params [:location]とparams [:category]の両方が存在する場合はどうなりますか? '@list'は2番目の条件で書き直され、その位置を考慮に入れるだけです...もちろん、それはOPがやりたいことです...可能です。質問には何らかの明確化が必要です。 –

+0

いいえ、where句は累積的です。どちらも元のコレクションに適用されます。だから、私は '' @ listing'の 'where'節を' 'リスト' 'ではないのです。 – SteveTurczyn

+0

ああ、私は今それを見ます。いい視点ね。私の間違い。 –

関連する問題