2011-01-23 7 views
0

こんにちは私はこのようなコードを持っている:のRails:スコープフィルターの質問

query = Post.order("published_at desc") 
query = query.where("location_id = ?", params[:location_id]) unless params[:location_id].blank? 
query = query.where("category_id = ?", params[:category_id]) unless params[:category_id].blank? 
@posts = query.all 

基本的にはポストはlocation_idのとCATEGORY_IDを持っています。だから私はそれらに基づいてフィルタリングすることができます。しかし、投稿にはhas_manyタグもあります。 たとえば、投稿にはjavaタグとcssタグがあります。

私は、Javaのタグですべての投稿をフィルタリングすることもできます。または、javaタグとcssタグの両方を持つ投稿。それ、どうやったら出来るの?

答えて

1

あなたTagモデルについては何も知らず、それは作業例を提供するために、少し難しいです。ただし、各タグが1つのPostに属し、タグにnameフィールドがあるhas_manyの関連付けを前提とした例を示します。あなたは、タグ名に基づいてフィルタリングし、あなたのPostモデルに適用範囲を定義することができます。

class Post < ActiveRecord::Base 
    scope :with_tags, lambda {|tags| joins(:tags).where("tags.name IN (?)", tags)} 
end 

そして、そのようにそれを使用します。私は、コードで使用できるように

tags = ["java"] 
@posts.with_tags(tags) 

tags = ["java", "css"] 
@posts.with_tags(tags) 
+0

は、あなたがそれを変更することができます上記はありますか? – SuperString

+0

あなたのコードで動作するはずですが、テストしませんでした。それはあなたにエラーを与えていますか?あなたのコードで 'query.all'を' query.with_tags([array of tags]) 'に置き換えてみてください。 –

+0

未定義のメソッドactiverecord – SuperString