has_manyの第2引数にscopeを渡すよい
class User < ApplicationRecord
has_many :published_articles, -> { where(state: 'published') }, class_name: Article
end
User.includes(:published_articles).published_articles
例
リファクタリング前
class User < ApplicationRecord
has_many :articles
end
class Article < ApplicationRecord
belongs_to :user
end
class UsersController < ApplicationController
def index
@users = User.includes(:articles)
end
end
- @users.each do |user|
- articles = user.articles.select { |article| article.state == 'published' }
- articles.each do |article|
p = article.title
リファクタリング後
class User < ApplicationRecord
has_many :articles
has_many :published_articles, -> { published }, class_name: Article
end
class Article < ApplicationRecord
belongs_to :user
scope :published, -> { where(state: 'published') }
end
class UsersController < ApplicationController
def index
@users = User.includes(:published_articles)
end
end
- @users.each do |user|
- user.published_articles.each do |article|
p = article.title