2016-07-22 11 views
3

このレールアプリケーションでは、サイトとフィルタの配列のアクティブなレコード関係を取るコントローラによって呼び出されるメソッドがあります。このメソッドは、配列内のすべてのフィルタここで方法は次のとおりです。ここで2つのアクティブなレコード関係の交差点を取得するレール

def filter_sites(sites, filters) 

    if filters.count > 0 
    filterable = sites.tag_join 
    filters.each { |f| sites = sites & filterable.with_tag(f) } 
    end 

    return sites 
end 

が使用されている範囲です:

def self.tag_join 
    joins(:tags).distinct 
end 

def self.with_tag(tag_id) 
    where('sites_tags.tag_id = ?',tag_id) 
end 

これが正しく機能しているが、問題は、それは配列を返すことです。私の質問は、より効果的な方法があるか、このメソッドを記述し、アクティブなレコード関係を返すか?コードの後半では、さらにクエリを連鎖させる必要があります。

大変助かりました。

+0

アクティブレコードからメソッドを参照してください。 –

+1

これを行う方法の1つは、醜いですが、SQLのINTERSECTを使用することです。基本的には、それぞれのタグに対してそれ以外は全く同じクエリを構築してから、それらをINTERSECTします。これは手作業で行う必要があるのでひどいですが、動作し、チェーンできるActiveRecordオブジェクトを返します。私はまた、あなたに 'sites_tags.tag_id =? '、filters [0])を実行できませんでした。 )? – henrebotha

+0

それほど醜いのではないですか?これは可変長のタグ配列なので、これをループで書く必要があります。私は、彼らがこれを行うレールの方法、非常に一般的な機能と思っていただろう... – PhilBrockwell

答えて

1

mergeとすることができます。 arrayが返されますが、これはクリーンコールです。便利で維持しやすいです。