gpt4 book ai didi

ruby-on-rails - 在 ActiveRecord 类方法中返回 `self` 丢失间接引用

转载 作者:数据小太阳 更新时间:2023-10-29 09:01:11 24 4
gpt4 key购买 nike

在 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

因此,返回 self 似乎使“仅此用户的兰花”的间接范围消失了。在那里返回 self 意味着我要返回 Orchid 类而不是 ActiveRecord::Relation

在互联网上阅读了一些内容,我确实找到了范围以及我应该使用它们的原因。范围确实按照我期望的方式工作,我现在正在使用它们。我只是不明白为什么在使用类方法定义时会这样。

最佳答案

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

如果您选择,两者仍然可以与其他范围链接。如果你真的想要一个 AR::Relation 回来,把 self 改成 Orchid.none。

关于ruby-on-rails - 在 ActiveRecord 类方法中返回 `self` 丢失间接引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35328173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com