按ID和Rails中的其他字段搜索表

时间:2016-06-13 15:07:38

标签: ruby-on-rails activerecord

我尝试搜索rails模型中的以下字段:id,description,notes和customer_name。

在我的模型中TechServiceSpecial

def self.search(params)
  q = "%#{params[:search].try(:strip).tr('%', '')}%"

  #build up general search
  general_search_fields.reduce(nil) do |running_query, field|
    if field =~ /id/
      main_check = arel_table[field].eq(q.to_i)
    else
      main_check = arel_table[field].matches(q)
    end

    if running_query.nil?
      main_check
    else
      running_query.or(main_check)
    end
  end
end

private

def self.general_search_fields
  %i(id description notes customer_name)
end

在我的控制器中(我使用Kaminari进行分页):

def search
  specials = TechServiceSpecial.where(TechServiceSpecial.search(params))
  @tech_service_specials = specials.page(params[:page]).per(200)
  render 'index'
end

如果我使用id搜索,则无法找到记录。因此,如果我有一个ID为1005的记录,那么该记录将不会在' 1005'的搜索结果中返回,除非描述,注释或customer_name也恰好包含1005。

将返回在描述,注释或customer_name中碰巧有1005的任何记录

所以,我调整控制器看起来像这样:

def search
  specials = TechServiceSpecial.where(TechServiceSpecial.search(params))
  specials.merge(TechServiceSpecial.where(id: params[:search].to_i))
  @tech_service_specials = specials.page(params[:page]).per(200)
  render 'index'
end

但我得到了同样的结果。不会返回ID为1005的记录。

如何让它返回一个id等于我正在搜索的字符串的记录?

1 个答案:

答案 0 :(得分:0)

var svg = d3.select("body").append("svg") .attr("width", diameter*1.5) .attr("height", diameter) .attr("style", "outline: thin solid grey;") .call(d3.behavior.zoom().on("zoom", function () { svg.attr("transform", "translate(" + d3.event.translate[0] + "," + d3.event.translate[1] + ")" + " scale(" + d3.event.scale + ")") })) .append("g") .attr("transform", "translate(" + radius*1.5 + "," + radius + ")") //this is the part that I added. .append("g") 方法中:

TechServiceSpecial.search

id的值始终为0,因为q = "%#{params[:search].try(:strip).tr('%', '')}%" ... if field =~ /id/ main_check = arel_table[field].eq(q.to_i) ... 以"%"开头。

如果字段为q,则应将q设置为params[:search].to_i