4

私は次のようなモデルを持っています

class Employee < ActiveRecord::Base
  belongs_to :branch, :foreign_key => :branch_code, :primary_key => :branch_code,
    :conditions => proc{["? BETWEEN enabled_day AND expiration_day", Date.current]}
end

class Branch < ActiveRecord::Base
  has_many :employees, :foreign_key => :branch_code, :primary_key => :branch_code

  scope :valid, lambda {where(["? BETWEEN enabled_day AND expiration_day", Date.current])}
end

従業員は支店に属していますが (シンプル)、支店には同じ branch_code のレコードが複数あり、「現時点で有効」なレコードを常に使用する必要があります。

(ご想像のとおり、プロジェクトは古いアプリの移植であり、古いスキーマを継承しています)

今では機能しますが、まったく同じ where 条件を 2 回記述する必要があります (実際には、ブランチはより多くのテーブルに関連付けられているため、5 回または 6 回)。

Branch のスコープを関連付けの条件として使用したり、DRY する他の方法を使用したりできないだろうか?

4

1 に答える 1

0

default_scope で has_many_through を使用するとうまくいきますか?

次のようなもの:

class Employee < ActiveRecord::Base
  has_many :assignments
  has_one :branch, :through => :assignments
end

class Branch < ActiveRecord::Base
  has_many :assignments
  has_many :employees, :through => :assignments
end

class EmployeeAssignments < ActiveRecord::Base
  attr_accessible :enabled_day, :expiration_day

  belongs_to :employee
  belongs_to :branch

  def self.default_scope
    where '? BETWEEN enabled_day AND expiration_day', Date.current
  end
end
于 2013-04-13T05:18:59.743 に答える