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
これが正しく機能しているが、問題は、それは配列を返すことです。私の質問は、より効果的な方法があるか、このメソッドを記述し、アクティブなレコード関係を返すか?コードの後半では、さらにクエリを連鎖させる必要があります。
大変助かりました。
アクティブレコードからメソッドを参照してください。 –
これを行う方法の1つは、醜いですが、SQLのINTERSECTを使用することです。基本的には、それぞれのタグに対してそれ以外は全く同じクエリを構築してから、それらをINTERSECTします。これは手作業で行う必要があるのでひどいですが、動作し、チェーンできるActiveRecordオブジェクトを返します。私はまた、あなたに 'sites_tags.tag_id =? '、filters [0])を実行できませんでした。 )? – henrebotha
それほど醜いのではないですか?これは可変長のタグ配列なので、これをループで書く必要があります。私は、彼らがこれを行うレールの方法、非常に一般的な機能と思っていただろう... – PhilBrockwell