gpt4 book ai didi

Ruby 范围/ActiveRecord 查询无操作

转载 作者:太空宇宙 更新时间:2023-11-03 18:09:44 24 4
gpt4 key购买 nike

我正在尝试在 Rails 中运行添加一个范围,该范围仅在将参数传递给它时才会启动 - 是否有一种巧妙的方法来避免困惑的 1=1 默认参数?

scope :tagged, -> (tags) { [tags].flatten.compact.empty? ? where('1 = 1') : where("#{self.table_name}.tags @> ARRAY[?]::varchar[]", [tags].flatten.compact)}

基本上,在将返回当前查询并允许继续链接的作用域内,where('1=1') 的等价物是什么?返回 self 不起作用 - 它返回对象并且所有链都需要从头开始构建。

最佳答案

范围 all 解决了您的问题。将庞大的在线内容拆分成更具可读性的内容:

scope :tagged, -> (tags) do
if [tags].flatten.compact.empty?
all
else
where(
"#{self.table_name}.tags @> ARRAY[?]::varchar[]",
[tags].flatten.compact
)
end
end

然而,这可以更进一步:如果 Rails 作用域返回 nil,那么无论如何它都会隐式调用 all!换句话说,我们可以简单地写:

scope :tagged, -> (tags) do
if [tags].flatten.compact.present?
where(
"#{self.table_name}.tags @> ARRAY[?]::varchar[]",
[tags].flatten.compact
)
end
end

关于Ruby 范围/ActiveRecord 查询无操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36837485/

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