最小限の例に分解します。
class User < ActiveRecord::Base
has_many :profiles
has_many :addresses, through: :profiles
end
class Profile < ActiveRecord::Base
belongs_to :user
has_many :addresses
end
class Address < ActiveRecord::Base
belongs_to :profile
def self.active_by_date
where(is_active: true).order('updated_at DESC')
end
end
class UsersController < ApplicationController
def index
@users = User.includes(profiles: :addresses)
end
end
上記のコントローラー アクションで、各ユーザーのプロファイルについて、日付順に並べ替えられたアクティブなアドレスをeager-loadしたいとします。私はこれを行うことができます:
class User < ActiveRecord::Base
has_many :profiles
has_many :addresses, through: :profiles
has_many :active_addresses_by_date, through: :profiles,
source: :addresses, class_name: Address,
conditions: ['address.is_active = ?', true],
order: 'address.updated_at DESC'
end
class UsersController < ApplicationController
def index
@users = User.includes(profiles: :active_addresses_by_date)
end
end
しかし、 のactive_by_date
スコープを再利用できないAddress
ため、条件と順序が 2 つの場所に存在するようになりました。Address
これを DRY して、最初のバージョンと同様に、「日付別アクティブ アドレス」の概念がモデルにのみ存在するようにしたいと思います。理想的には、@users.each { |user| user.addresses.active_by_date }
クエリを実行せずにビューで呼び出すことができます。これは ActiveRecord で可能ですか? もしそうなら、どうすればよいでしょうか?