我试图在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
不起作用 - 它返回对象,并且需要从头开始重新构造所有链。
答案 0 :(得分:3)
范围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 scope返回nil
,那么无论如何它隐式调用all
!换句话说,我们可以简单地写:
scope :tagged, -> (tags) do
if [tags].flatten.compact.present?
where(
"#{self.table_name}.tags @> ARRAY[?]::varchar[]",
[tags].flatten.compact
)
end
end