2016-07-12 9 views
0

TLDRでの句:句は、ネストされた(ダウンネストの1つのまたは2段階のいずれか)で動作するようにどこで取得することはできませんhas_manyの関連今すぐのRails:ネストされたhas_manyの関連

#Author.rb 
has_many :posts 


#Post.rb 
belongs_to :author 
has_one :post_setting 


#PostSetting.rb 
#Has attributes like draft (bool), flagged(bool), etc. 

belongs_to :post 

、私はあればAuthorにassociationを作成しようとすると、post_setting.draft = falseのすべての投稿が検索されます。たとえば、以下のようになります。残念ながら、代わりに次のエラー

PG::UndefinedTable: ERROR: missing FROM-clause entry for table "post_setting" 

で失敗

has_many :published_posts, 
    -> { 
     includes(:post_setting) 
     .where(post_setting: {draft: false}) 
     .distinct 
    }, 
    class_name "Post" 

、私は同様に次の操作を実行できるようにしたいのですが - 一般的に

#Group.rb 
has_many :authors 
has_many :posts, 
    -> { 
     includes(:post_setting) 
     .where(post_setting: {draft: false}) 
     .distinct 
    }, 
through: authors 

を、I私は、どのように/協会/協会での作業が含まれているかについてのルールについては、あまり明確ではないと感じています。記事の範囲を作成者のhas_manyに含めるよりも、スコープを作成することをお勧めしますか?

ありがとうございました!

PS。私はRails 4.2.5を使用しています。これは混乱することができますが、一般的にjoinsincludesは関連名を使用しながらの条件は、基本となるテーブル名を使用し

has_many :published_posts, 
    -> { 
     includes(:post_setting) 
     .where(post_settings: {draft: false}) # Note the plural table name 
     .distinct 
    }, 
    class_name "Post" 

:クエリは、あなたが適切なネーミングを使用する必要があります動作させるために

答えて

2

アソシエーションを介して利用可能なデータセットをいくつかの条件に一致するように制限する理由がある場合は、親モデルで定義されたアソシエーション条件を使用します。

このような理由がなく、関連するデータセットのフィルタ処理に柔軟性を持たせたい場合は、参照モデルで定義されたスコープを使用してください。

+0

素早く答えて名前を指摘してくれてありがとう。その場合、私はまだ次のエラーを受け取ります: 'PG :: UndefinedColumn:エラー:列post_settings.draftが存在しません'何がうまくいかない可能性についての考え? – geoboy

+0

'db/schema.rb'の' post_settings'テーブルスキーマをここに投稿できますか? –

+0

実際、あなたのソリューションはうまくいった - ありがとう! 2番目の部分については、「参照モデルで定義されたスコープ」を使用して説明しました。どのようにスコープを 'has_many'関係で使うことができますか?公開された投稿の「投稿」のスコープを定義したとします。 'Group.rb'や' Author.rb'でどのように使うことができますか?マージを使用しますか? (パフォーマンスは効率的ですか?) – geoboy

関連する問題