我有两个模型,需要查询以下字段。
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
我被卡住的地方:
Customer
模型,但做与搜索匹配Relative
。
search()
模型上几乎相同的Relative
- 我相信我可以写 - 但我再次不确定如何填写@todo
以上只能加载那些与查询匹配的Relative
。我正在寻找正确方向的任何碰撞。
答案 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会照顾其余的。