web-dev-qa-db-ja.com

Railsスコープを含む

Authorというモデルがあります。著者には多くの記事があります。記事には.publishedというスコープがあり、where(published:true)を実行します。

公開された記事とともに著者をロードしたい。私は試した:

Author.includes(:articles.published).find(params[:author_id])

しかし、それはエラーを投げます:未定義のメソッド 'published'。何か案が?

26
MonsieurNinja

最善の解決策は次のとおりだと思います。

Author.includes(:articles).where(:articles=>{published: true}).find(params[:author_id])

または、スコープを作成できます:

class Author < ActiveRecord::Base 
    scope :with_published_articles, -> { includes(:articles).where(articles: { published: true}) }
end

その後:

Author.with_published_articles.find(params[:author_id].to_s)
37
NikCasper

Authorで_with_published_articles_というスコープを次のように指定します。

_scope :with_published_articles, -> { joins(:articles).merge(Article.published) }
_

これにより、将来的にAuthorpublished動作が変更される場合にArticleモデルでwhere(active: true)も指定するように問題が解決します。

だから今、あなたは呼び出すことができます:

_Author.with_published_articles.find(params[:author_id])
_
18
Manuel van Rijn

このコードを試してください:

Author
  .includes(:articles).where(published: true).references(:articles)
  .find(params[:author_id])

ここで、上記の例に関する詳細情報を見つけることができます。 includes api doc

2
max_spy

を使用して:

class Articles < ActiveRecord::Base 
    scope :published, -> { where(articles: {published: true}) }
end

Autorでスコープを定義する

class Author < ActiveRecord::Base 
    scope :with_published_articles, -> { joins(:articles).merge(Articles.published) }
end

または

Author.joins(:articles).merge(Articles.published).find(params[:author_id])
1
Wagner Caixeta