使用范围检查相关模型是否在Rails中没有其他相关模型?

时间:2013-01-04 12:15:38

标签: ruby-on-rails

我努力让范围有效。我已经概述了下面的简单模型:

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) }

然而,显然,出勤和认证之间的直接关系并不存在。

我是否应该创建此链接(使用多次通过),或者是否有在范围内指定此链接的方法。

非常感谢任何建议。

3 个答案:

答案 0 :(得分:0)

修改

尝试关注并让我知道它是否有效..

class Attendances  < ActiveRecord::Base
  belongs_to :user
  scope :fulfilled_without_user_authentications, lambda { joins(:user => :authentications).where('authentications.user_id != users.id') }
end

答案 1 :(得分:0)

也许你首先需要重新思考你的关系。 用户是否可以在未经过身份验证的情况下出席?

如果没有,我会将你的关系重构为“有很多通过”:

答案 2 :(得分: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