我正在尝试利用.exists?()
返回真或假,非常简单。像这样做单线范围会很好:
scope :any_alternates, lambda{|apikey| Track.exists?(:track_id => apikey)}
甚至使用此范围语法:
scope :any_alternates, ->(apikey) {Track.exists?(:track_id => apikey)}
但由于某些原因,上述范围将在我的数据库表中没有匹配时返回所有行。它在找到匹配时应该如何工作,但如果没有则会中断......
我被迫创建一个方法,据我所知,它应该在上述范围内做同样的事情:
def self.any_alternates(apikey)
return Track.exists?(:track_id => apikey)
end
知道为什么.exists?()
无法在我的范围内工作?
如果没有匹配,那么范围将返回数据库中的所有行...(我在上面更新了提及)。我检查了范围和方法上生成的查询,看看是否存在差异,但它们是相同的:
SELECT 1 AS one FROM `tracks` WHERE `tracks`.`track_id` = '_btbd_uUmQT8hYUK3SrJ9Q' LIMIT 1
即使我正在搜索名为track_id
的列,但此列未设置为与其他模型的关系。我知道这很令人困惑,但这就是这个表的设置方式(有充分的理由,超出这个问题,所以不值得在这里触及)
答案 0 :(得分:0)
你确定你有正确的搜索吗?具有track_id的轨道意味着Track和另一个轨道模型之间存在关联,这将是有趣的。
范围语法也是关闭的。范围只是表的查询,因此传统上它只是与当前模型相关联的事物。
scope :any_alternates, ->(api_key) { |api_key| where(track_id: api_key }
答案 1 :(得分:0)
你传递的是零吗?这将导致返回所有记录。您可以在示波器中删除Track,如下所示:
scope :any_alternates, lambda{|apikey| exists?(:track_id => apikey)}
传递nil时会发生什么:
> Track.any_alternates(nil).count
Track Exists (1.7ms) SELECT 1 AS one FROM "track" WHERE "tracks"."track_id" IS NULL LIMIT 1
而不是传递值:
> Track.any_alternates('X4DBA36gbtqgWl4F1')
Track Exists (0.4ms) SELECT 1 AS one FROM "tracks" WHERE "tracks"."track_id" = $1 LIMIT 1 [["track_id", "X4DBA36gbtqgWl4F1"]]