2016-11-19 2 views
1

こんにちは私は自分のクエリに問題があります。 以下の私のモデルがあります。結合がありクエリに含まれていると、アクティブレコードがコレクションを更新しない

class Owner 
    has_many :busiensses 
    has_many :adverts 
end 

class Business 
    belongs_to :owner 
end 

class Advert 
    belongs_to :owner 
end 

私はこのクエリのすべてが大丈夫であることを確認し、それが必要なオブジェクトの完全な右のコレクションを返した場合:

Owner.joins(:adverts).includes(:businesses) 
    .where(businesses: {owner_id: nil}) 

をしかし、私は更新を照会するために追加したときにはエラー

を発生させます
Owner.joins(:adverts).includes(:businesses) 
    .where(businesses: {owner_id: nil}) 
    .update_all(status: 'sth') 

エラー:

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: missing FROM-clause entry for table "businesses" 

どこに問題がありますか?私はSQLからこのエラーを賭けて、あなたが忘れたときにそれを賭けました。sthFROMステートメントと、sthがさらに必要ですが、ARのどこに追加するのを忘れましたか?

+1

試みは、 '(「owners.status =『STHを』」).update_allを行うには、' – Syl

答えて

0
Owner.joins(:adverts) 
.includes(:businesses) 
.where(businesses: {owner_id: 1}) 
.update_all(name: "blaaaaa") 

この文は、このクエリに変換:

UPDATE "owners" 
SET "name" = 'blaaaaa' 
FROM "businesses" /* missed this */ 
WHERE "owners"."id" IN 
(SELECT "owners"."id" FROM "owners" 
INNER JOIN "adverts" 
ON "adverts"."owner_id" = "owners"."id" 
WHERE "businesses"."owner_id" = 1) 

あなたは、エラーが発生し"FROM 'bussinesses'"欠場:

missing FROM-clause entry for table "businesses"

私の解決策ではなく、includesを使用してのjoinsを使用することですが。それは私のマシンで正常に動作します。

Owner.joins(:adverts) 
.joins(:businesses) 
.where(businesses: {owner_id: 1}) 
.update_all(name: "blaaaaa") 

=> 1 
+0

これは素晴らしいソリューションですが、私の第一の目標は、更新するために、所有者のコレクションを見つけることだった、私はこのクエリで問題を解決しました: 'Owner.joins(:adverts).joins( 'belongs.id = enterprises.owner_idのどこにもbusiness.owner_idがNULLである左外部結合ビジネス')。distinct.update_all(ソース: 'sth')' –

関連する問題