gpt4 book ai didi

ruby-on-rails - Rails,是否应用范围取决于参数是否为nil

转载 作者:行者123 更新时间:2023-12-04 07:24:49 26 4
gpt4 key购买 nike

我已经多次遇到此问题:我想在查询上应用范围,但前提是传递给该范围的参数不为null。所以

tags = Tag.where(name: params[:name]) if params[:name]

但是,这有两个问题。一种是Rails会立即评估查询,因此如果我想对其应用更多条件,请说
tags.where(location: params[:place]) if params[:place]

它将再次查询数据库。第二个问题是它看起来不太好,我尝试使用类方法来解决。
  class Tag < ActiveRecord::Base
def self.name_like this_name
if !this_name.blank?
where("name ILIKE '%#{this_name}%'")
else
#what do I put here? `all` does not work
end
end
end

但是,我不能仅将 all放在其中,因为这会评估查询。有什么想法吗?

最佳答案

在这里,您可以使用lambda范围,并使用self调用self.all:

  class Tag < ActiveRecord::Base

scope :named_like, (lambda do |name|
if name.present?
where("name ILIKE ?", "%#{name}%")
else
scoped # does not apply a where clause
end
end)

end

对于一个非常基本的范围,这占用了太多行,这是压缩版本:
class Tab < ActiveRecord::Base

scope :named_like, lambda{ |name| self.where("name ILIKE ?", "%#{name}%") if name.present? }

end

还:
  • 切勿在Where 子句中使用直接字符串插值:http://blog.presidentbeef.com/blog/2013/02/08/avoid-sql-injection-in-rails/
  • 关于ruby-on-rails - Rails,是否应用范围取决于参数是否为nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15097142/

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