Activerecord Rails`notin(null)`不返回任何结果

Activerecord Rails`notin(null)`不返回任何结果,activerecord,ruby-on-rails-4,Activerecord,Ruby On Rails 4,我试图检索一些记录,但当其中一个参数是空数组时出现问题。我理解为什么查询没有返回任何结果,但我不知道在rails中处理它的最佳方法。在我的密码里,我在打电话 @user.trustees.where(["trustees.default = true AND trustees.id NOT IN (?)", trustees.map{ |t| t.id }]) 当受托人数组实际包含对象时,这与预期一样有效,但是当它不包含对象时,查询将不返回任何内容,因为SQL生成的结果是 SELECT `us

我试图检索一些记录,但当其中一个参数是空数组时出现问题。我理解为什么查询没有返回任何结果,但我不知道在rails中处理它的最佳方法。在我的密码里,我在打电话

@user.trustees.where(["trustees.default = true AND trustees.id NOT IN (?)", trustees.map{ |t| t.id }])
当受托人数组实际包含对象时,这与预期一样有效,但是当它不包含对象时,查询将不返回任何内容,因为SQL生成的结果是

SELECT `users`.* 
FROM `users` 
INNER JOIN `trustees` ON `users`.`id` = `trustees`.`trustee_id` 
WHERE `trustees`.`truster_id` = 1 
AND (trustees.default = true 
AND trustees.id NOT IN (NULL))
避免我遇到的
notin(NULL)
问题的最简单方法是什么?

您可以这样做:

@user.trustees.where(default: true).where.not(id: trustees.map{ |t| t.id })

为了获得更好的性能,请使用以下命令

@user.trustees.where(default: true).where.not(id: trustees.pluck(:id))

在我使用的类似查询中,使用pulk而不是map大大缩短了加载时间,从90ms缩短到3ms。

完美!我选择了
@user.trusters.where([“trusters.default=true和(trusters.id不在(:trusters)或:trusters为NULL)”,{trusters:trusters.map(&:id)}])
,但这更简洁。干杯:D@PaReeOhNos:这就是在SO:)上使用正确的rails版本标记的优点。当使用了错误的标签,然后用户抱怨它在他们使用的版本上不起作用时,总是很烦人:P