查询和预加载关联

时间:2015-03-02 01:39:13

标签: ruby-on-rails ruby ruby-on-rails-4 arel

我有两个模型,需要查询以下字段。

  • Customer

    • :first_name
    • :last_name
    • :address
    • :email
  • Relatives

    • :first_name
    • :last_name
    • :address
    • :title

Customer有很多Relatives

我正在尝试编写一个search()方法,该方法将返回Customer条记录的集合,其中 Customer或其中1 +的字段相关Relatives与查询匹配。

目标是能够迭代Customer条记录的集合。如果customer.relatives.present?,我将知道循环使用Relative提供的相关Customer模型 - 该集合中的模型与查询匹配。

我目前有这样的事情:

class Customer < ActiveRecord::Base

  has_many :relatives

  def self.search(params={})
    cols  = %i(address caseworker last_name)
    conds = []

    cols.reject! { |col| params[col].blank? }

    conds << cols.collect { |col| "clients.#{col} like ?" }.join(" or ")
    cols.each { |col| conds << "%#{params[col]}%" }

    query = self.send(:where, conds)

    # @todo query relatives here!    
  end

end

我被卡住的地方:

  • 我无法弄清楚ARel加入/合并/联合/(我不知道我正在寻找的术语)与搜索不匹配的Customer模型,但与搜索匹配Relative
    • 我相信我需要在search()模型上几乎相同的Relative - 我相信我可以写 - 但我再次不确定如何填写@todo以上只能加载那些与查询匹配的Relative

我正在寻找正确方向的任何碰撞。

2 个答案:

答案 0 :(得分:2)

根据您的数据库,您可能希望查看pg_search之类的内容以进行全文搜索。

在构建搜索索引之后,与客户查询匹配的热切加载的亲属是微不足道的。

class Customer < ActiveRecord::Base
  include PgSearch
  has_many :relatives

  pg_search_scope :search,
    :against => [:address, :caseworker, :last_name]
    :associated_against => {
    :relatives => [:address, :caseworker, :last_name]
  }
end

Customer.search("foobar").preload(:relatives)

答案 1 :(得分:0)

这个gem是对mysql数据库https://github.com/makandra/dusen

的搜索和全文搜索的简单实现

您可能需要进行一些编码才能使gem正常工作,例如define search_text等。但是这个gem会照顾其余的。