加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails,根据参数是否为零来应用范围

发布时间:2020-12-17 04:39:57 所属栏目:百科 来源:网络整理
导读:我已经多次遇到这个问题了:我想在查询中应用范围,但前提是传递给范围的参数不是null.所以 tags = Tag.where(name: params[:name]) if params[:name] 但是,这有两个问题.一个是Rails会立即评估查询,所以如果我想对它应用更多条件,比如说 tags.where(location
我已经多次遇到这个问题了:我想在查询中应用范围,但前提是传递给范围的参数不是null.所以
tags = Tag.where(name: params[:name]) if params[:name]

但是,这有两个问题.一个是Rails会立即评估查询,所以如果我想对它应用更多条件,比如说

tags.where(location: params[:place]) if params[:place]

它将再次查询DB.第二个问题是它看起来不太好,我试图用类方法来解决它.

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

但是,我不能简单地将所有内容放在那里,因为它会评估查询.有什么想法吗?

解决方法

在这里你可以使用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/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读