Ruby scope / ActiveRecord查询no-ops

时间:2016-04-25 10:04:48

标签: ruby activerecord

我试图在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不起作用 - 它返回对象,并且需要从头开始重新构造所有链。

1 个答案:

答案 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