0

スコープを機能させるのに苦労しています。以下に簡単なモデルを概説しました。

class User < ActiveRecord::Base
  has_many :authentications
  has_many :attendances
end

class Authentication < ActiveRecord::Base
  belongs_to :user
end

class Attendances  < ActiveRecord::Base
  belongs_to :user
end

私がやろうとしているのは、認証を受けていないユーザーをチェックする、Attendances のスコープを作成することです。次のようなもの:

scope :fulfilled_without_user_authentications, lambda { includes(:authentications).where('authentications.id' => nil) }

ただし、明らかに、出席と認証の間に直接的な関係は存在しません。

このリンクを作成する必要がありますか (has many through を使用)、またはスコープ自体内でこれを指定する方法はありますか。

アドバイスをいただければ幸いです。

4

3 に答える 3

0

編集

フォローしてみて、うまくいくかどうか教えてください。

class Attendances  < ActiveRecord::Base
  belongs_to :user
  scope :fulfilled_without_user_authentications, lambda { joins(:user => :authentications).where('authentications.user_id != users.id') }
end
于 2013-01-04T12:33:58.887 に答える
0

おそらく、最初に関係を再考する必要があります。ユーザーは認証なしで出席できますか?

そうでない場合は、関係を「多くのスルー」にリファクタリングします。

于 2013-01-04T13:00:37.300 に答える
0

わかりましたので、私が解決したアプローチは次のとおりです。

class User
  scope :with_authentications, where("id IN (SELECT user_id FROM authentications)")
  scope :without_authentications, where("id NOT IN (SELECT user_id FROM authentications)")
end

class Attendance
  scope :with_user_authentications, lambda {
    joins "INNER JOIN users ON users.id = attendances.attendee_id" and User.with_authentications
  }
  scope :without_user_authentications, lambda { 
    joins "INNER JOIN users ON users.id = attendances.attendee_id" and User.without_authentications
  }
end
于 2013-01-05T18:16:18.873 に答える