Rails ActiveRecord .where方法不执行SQL查询

时间:2016-03-31 14:27:49

标签: ruby-on-rails activerecord

我编写了一组Rails搜索方法,它采用可选参数来定义搜索的严格程度。核心方法如下:

class Participant < ActiveRecord::Base

  def self.matches(field_name, param, rigor = 'exact')
    where("lower(#{field_name}) like ?", "#{param}") if rigor == 'exact'
    where("lower(#{field_name}) like ?", "%#{param}%") if rigor == 'soft'
  end

end

我得到了这个结果:

[1] pry(main)> >> Participant.matches('last_name', 'Goodman', 'soft')
Participant.matches('last_name', 'Goodman', 'soft')
      Participant Load (5.1ms)  SELECT "participants".* FROM "participants" WHERE (lower(last_name) like '%Goodman%')
    => [#<Participant:0x007fc6fecee8d0
      id: 17,
      first_name: "Harris",
      last_name: "Goodman",
      gender: 0,
      birthdate: nil,
      city: nil,
      state_code: "CA",
      email: nil,
      phone: nil,
      created_at: Wed, 30 Mar 2016 11:18:33 MDT -06:00,
      updated_at: Wed, 30 Mar 2016 11:18:33 MDT -06:00,
      created_by: 1,
      updated_by: 1,
      country_code: "US",
      user_id: nil>]

    [2] pry(main)> >> Participant.matches('last_name', 'Goodman', 'exact')
    Participant.matches('last_name', 'Goodman', 'exact')
    => nil

当确定&#39;确切的&#39; Rails似乎没有触发SQL查询。参数传递。

我还尝试=代替like,但得到的结果相同。这项工作超过一个小时没有成功。任何想法都会受到欢迎。

编辑:好的,所以进行一些重构可以解决问题:

  def self.matches(field_name, param)
    where("lower(#{field_name}) like ?", "%#{param}%")
  end

  def self.exact_matches(field_name, param)
    where("lower(#{field_name}) like ?", "#{param}")
  end

我仍然想知道为什么这样可行,但更优雅的早期解决方案却没有。

1 个答案:

答案 0 :(得分:0)

每个函数/方法都返回最后一个评估值。 在你的情况下它是 where("lower(#{field_name}) like ?", "%#{param}%") if rigor == 'soft'

如果严格不是'软'则返回nil。 所以添加一个返回应该做你想要的:

 def self.matches(field_name, param, rigor = 'exact')
    return where("lower(#{field_name}) like ?", "#{param}") if rigor == 'exact'
    where("lower(#{field_name}) like ?", "%#{param}%") if rigor == 'soft'
  end