categories[0].name
の使用は、カテゴリのname
列に有効なSQLリファレンスではありません。インスタンス化Battle
レコードの:categories
関係にと熱心に負荷適切なCategory
のActive Recordオブジェクト - Battle
用とCategory
のための1 - このコードは2つのクエリを実行することを
Battle.includes(:categories).reject do |battle|
['Other', 'Fashion'].include? battle.categories.map(&:name)
end
注:
はこれを試してみてください。これは、ガイドのin detailsに記載されているN + 1個のクエリを防ぐのに役立ちます。
上記のコードは、望ましくないカテゴリを持つレコードを削除する前に、メモリALL Battle
のレコードに最初にロードすることにも注意してください。あなたのデータによっては、これは禁止されることがあります。
battle_ids_sql = Battle.select(:id).joins(:categories).where(categories: {name: ['Other' ,'Fashion']}).to_sql
Battle.where("id NOT IN (#{battle_ids_sql})")
battle_ids_sql
があなたの望ましくないの1を持って戦いIDを返すSQL文です:あなたが唯一の関連ActiveRecordのオブジェクトがインスタンス化されますように、SQLクエリを制限したい場合は、以下のようなもので逃げることができカテゴリ。実際に実行されるSQLは、その内部SQLにないすべてのBattle
レコードをフェッチします。これは効果的ですが、控えめに使用してください。このようなクエリは、すばやく維持するのが難しくなる傾向があります。
あなたはおよそjoins
、includes
と他の二つの関連した方法(eager_load
とpreload
)hereを学ぶことができます。
あなたがする必要があります。 "(categories.name NOT IN( 'Other'、 'Fashion'))") –