Rails - 我的范围中为什么不能使用activerecord?

时间:2015-04-08 02:38:36

标签: ruby-on-rails ruby activerecord

我正在尝试利用.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的列,但此列未设置为与其他模型的关系。我知道这很令人困惑,但这就是这个表的设置方式(有充分的理由,超出这个问题,所以不值得在这里触及)

2 个答案:

答案 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"]]