2017-01-19 13 views
0

Order has_many TypeLogisticしかし、重要なこと... OrderTypeLogisticを持っていません。両方ともOrder & TypeLogisticは、status_id属性を持っています。この主な条件が満たされない場合子供の属性に基づいて親のためのRailsクエリ(子供が存在し、すべての子どもを見ている場合)

order.status_id = 4
  • は、子供
  • orderが子供type_logisticsを持っていない場合は、すべての子type_logisticsを持っている必要がありますについては何も無視:私はすべてのuniqのOrderレコードを見つけたいですすなわちいずれか1のstatus_id、または2(ない任意の他の数ではなくnull

...それらが見出されるレコードである

Order 
    status_id = 4 
    TypeLogistics 
    1 - status_id = 1 

Order 
    status_id = 4 
    TypeLogistics 
    1 - status_id = 2 

Order 
    status_id = 4 
    TypeLogistics 
    1 - status_id = 1 
    2 - status_id = 2 

Order 
    status_id = 4 

これらのは私が動作するコードの一部を書いた

# because order.status_id != 4 
Order 
    status_id = 1 
    TypeLogistics 
    1 - status_id = 1 

# because type_logistic child does not have a status_id that's 1 or 2 
Order 
    status_id = 4 
    TypeLogistics 
    1 - status_id = nil 

# because type_logistic child does not have a status_id that's 1 or 2 
Order 
    status_id = 4 
    TypeLogistics 
    1 - status_id = 3 

# because not all type_logistic children have a status_id that's 1 or 2 
Order 
    status_id = 4 
    TypeLogistics 
    1 - status_id = 1 
    2 - status_id = nil 

# because not all type_logistic children have a status_id that's 1 or 2 
Order 
    status_id = 4 
    TypeLogistics 
    1 - status_id = 2 
    2 - status_id = 3 

を見つけることはない記録であるが、それは純粋な whereクエリではなく selectを使用しているため、それは不格好です。私を助けてくれますか? joinsを使用して

WORKING、SUB-PARのCODE

@orders = Order.includes(:type_logistics).where(status_id:4).select { |o| ([[1],[2],[1,2]].include? o.type_logistics.pluck(:status_id).uniq) || o.type_logistics.count == 0 }.uniq 

答えて

0

は、あなたが参加団体に照会できるようになります。 preloadは、where("type_logistics.status_id IN (?)", [1,2])クエリで指定された条件を満たすものが存在する場合、type_logisticsを読み込みます。 preloadは、ほとんどincludesと同様の動作をします。

@orders = Order.joins(:type_logistics).preload(:type_logistics).where("orders.status_id = ?", 4).where("type_logistics.status_id IN (?)", [1,2]).uniq 
+0

残念ながら、これは機能しません。注文に2種類のロジスティクスがあり、そのうちの1つがステータス1または2(ただし、ステータスがnilまたはその他のもの)の場合は、 – james

+0

が「はい」であることが判明しているので、1または2以外のステータスは明示的にロードしないでください。これは 'where.not(" type_logistics.status_id IN(?) "、[nil、3、4])'を追加することで指定できます。 –

+0

しかし、問題は、どのstatus_idsを数えるべきではないかを明示する必要がありますが、可能なすべての数値を今すぐ​​伝えることができませんでした。 – james

関連する問題