在 has_many :through 关联中,对默认范围的覆盖没有被持久化(以一种有用的方式)。
以下是模型中的相关内容:
class User
has_one :invitation
default_scope where(registered: true)
end
class Invitation
belongs_to :user, conditions: { registered: [true, false] }
belongs_to :program
end
class Program
has_many :invitations
has_many :users, through: :invitations
end
通过邀请查找用户按预期工作。
Invitation.joins(:user)
生成这个:
SELECT `invitations`.* FROM `invitations` INNER JOIN `users` ON `users`.`id` = `invitations`.`user_id` AND `users`.`registered` IN (1, 0)
鉴于此,我假设 Program.last.users 应该找到所有相关用户,无论注册是真还是假。相反,我得到了这个:
SELECT `users`.* FROM `users` INNER JOIN `invitations` ON `users`.`id` = `invitations`.`user_id` WHERE `users`.`registered` = 1 AND `invitations`.`program_id` = 52 AND (`users`.`registered` IN (1, 0))
这是我期望的 SQL。我如何创建一个给我这个的协会?
SELECT `users`.* FROM `users` INNER JOIN `invitations` ON `users`.`id` = `invitations`.`user_id` WHERE `users`.`registered` IN (1, 0) AND `invitations`.`program_id` = 52
更多背景信息:我正在使用 rails 3.1.3,在此功能需要退出之前升级 rails 不是一个可行的选择。摆脱 default_scope 也不是我能做的。