我努力让范围有效。我已经概述了下面的简单模型:
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) }
然而,显然,出勤和认证之间的直接关系并不存在。
我是否应该创建此链接(使用多次通过),或者是否有在范围内指定此链接的方法。
非常感谢任何建议。
答案 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