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

我正在尝试做的是在出勤上编写一个范围,以检查没有身份验证的用户。类似于以下内容:

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

但是,显然出席和认证之间的直接关系并不存在。

我应该创建这个链接(使用有很多通过),还是有办法在范围本身内指定它。

任何建议将不胜感激。

4

3 回答 3

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 回答
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 回答