4

最小限の例に分解します。

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 で可能ですか? もしそうなら、どうすればよいでしょうか?

4

1 に答える 1

0

多分私は何かを理解していませんが、それはあなたactive_by_date

  def self.active_by_date
    where("addresses.is_active = ?", true).order('addresses.updated_at DESC')
  end

を呼び出すことはできませんUser.includes(profiles: :addresses).active_by_dateか?

于 2013-06-21T14:44:48.400 に答える