0

在 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 也不是我能做的。

4

3 回答 3

0
@program = Program.last    
@user = @program.users.unscoped.all
于 2015-08-25T04:37:44.627 回答
0
class Program
  # override association with a method
  def users
    Program.joins(:invitation).joins(:users).where('users.registered = true')....ETC
  end
end
于 2015-08-25T04:19:27.460 回答
0

我能够使用 has_and_belongs_to_many 关联来解决这个问题。在此关联上设置的条件会覆盖用户的默认范围。

class Program
  has_and_belongs_to_many :users,
                          join_table: :invitations,
                          conditions: {registered: [true, false]}
end

program.users产生这个 SQL:

SELECT `users`.* 
FROM `users`
INNER JOIN `invitations`
ON `users`.`id` = `invitations`.`user_id` 
WHERE `invitations`.`program_id` = 111
AND `users`.`registered` IN (1, 0)
于 2015-08-28T22:11:02.490 回答