4

モデル User と Event の間のこのような関係をモデル化したいと思います。

したがって、私は次のクラスから始めました。

class User < ActiveRecord::Base
...
end

class Attendance < ActiveRecord::Base
# with columns user_id and event_id
...
end

class Event < ActiveRecord::Base
  has_many :attendances
  has_many :users, :through => :attendances
  ...
end

これまでのところ、すべて問題ありません。ユーザーを割り当てて出席にアクセスできます。しかし今、私は、例えば「出席」、「無断欠席」、... ユーザーを区別できるように、状態を活用したいと考えています。私の最初の試みは:

class Event < ActiveRecord::Base
  has_many :attendances
  has_many :users, :through => :attendances
  has_many :unexcused_absent_users, -> { where :state => 'unexcused' },
                                   :through => :attendances,
                                   :source => :user
  ...
end

(:source を指定しないと、'unexcused_absent_users' という名前のアソシエーションに属するものを検索するため、指定する必要があります) ここでの問題は、where-述語がテーブル 'users' で評価されることです。

すべての状態に新しい結合テーブル/モデルを導入せずに、これを「正しく」解決する方法がわかりません。特に、すべてのユーザーがイベントごとに 1 つの状態になる可能性があるため、1 つの出席モデルによるソリューションが理にかなっていると思います。

これを正しくする方法はありますか?

4

3 に答える 3

4

スコープを単純に狭めて、正しいテーブルを確認できます。

  has_many :unexcused_absent_users, -> { where(attendances: {state: 'unexcused'}) },
                               :through => :attendances,
                               :source => :user

さらに良いことに、このスコープを Attendance モデルに追加してマージします。

class Attendance < ActiveRecord::Base
  def self.unexcused
    where state: 'unexcused'
  end
end

class Event < ActiveRecord::Base
  has_many :unexcused_absent_users, -> { merge(Attendance.unexcused) },
                               :through => :attendances,
                               :source => :user      
end
于 2013-06-30T16:34:59.637 に答える