在 ActiveRecord 类方法中返回“self”会丢失间接引用

Returning `self` at ActiveRecord class method loses indirect reference

提问人:Thiago Negri 提问时间:2/11/2016 更新时间:2/11/2016 访问量:1203

问:

在 ActiveRecord 中定义类方法时,如果我返回 ,则间接引用将丢失。self

我不确定我是否使用了正确的词汇,因为我只是在学习 Ruby on Rails,所以这里有一个例子:

class User < ActiveRecord::Base
  has_many :orchids
end

class Orchid < ActiveRecord::Base
  belongs_to :user

  def self.search(query)
    if query.present?
      query = '%' + query.gsub(/\s+/, '%') + '%'
      where 'gender ILIKE :query OR variety ILIKE :query', query: query
    else
      # Problematic line:
      self
    end
  end
end

使用上面的定义,这是发生的事情:

% User.last.orchids.count
   (0.8ms)  SELECT COUNT(*) FROM "orchids" WHERE "orchids"."user_id" = $1  [["user_id", 2]]
 => 0 

% User.last.orchids.search('').count
   (1.2ms)  SELECT COUNT(*) FROM "orchids"
 => 449 

% User.last.orchids.search('cat').count
   (1.2ms)  SELECT COUNT(*) FROM "orchids" WHERE "orchids"."user_id" = $1 AND (gender ILIKE '%cat%' OR variety ILIKE '%cat%')  [["user_id", 2]]
 => 0

因此,返回似乎使“只有该用户的兰花”的间接范围消失了。返回那里意味着我要返回类而不是?selfselfOrchidActiveRecord::Relation

在互联网上阅读了一些内容,我确实发现了有关示波器以及为什么我应该使用它们的信息。示波器确实按照我期望的方式工作,我现在正在使用它们。我只是不明白为什么在使用类方法定义时会这样做。

Ruby-on-Rails Ruby ActiveRecord 最不令人惊讶

评论


答:

3赞 james2m 2/11/2016 #1

Self 将返回类,因为 self 是类。as scope 返回一个 ActiveRecord::Relation 实例。因此,Orchid.where 方法构建并返回一个新的 ActiveRecord::Relation,而 self 将只返回类本身。

如果您愿意,两者仍然可以与其他范围链接。如果您真的想要返回 AR::Relation,请将 self 更改为 Orchid.none。