在 ActiveRecord 中定义类方法时,如果我 return 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
所以,返回self
似乎让“只有这个用户的兰花”的间接范围消失了。返回self
那里意味着我要返回Orchid
课程而不是ActiveRecord::Relation
?
在互联网上阅读了一下,我确实找到了有关范围以及为什么要使用它们的信息。范围确实按我期望的方式工作,我现在正在使用它们。我只是不明白为什么在使用类方法定义时会这样。