所以我有很多has_many属性。我正在快速搜索用户在一个文本框中输入一个术语,参数[:q],然后我搜索该批次的每个字段以查看它是否匹配。我还想检查他们的属性,如果属性匹配,并且只返回该批次。
我完成了这个,就像这样
if params[:q]
@property_lots = []
@lots.each do |lot|
@property_lots << lot if lot.properties.where(["name LIKE :query OR value LIKE :query", :query => "%#{params[:q]}%"]).any?
end
@lots = @lots.where(["number LIKE :query OR title LIKE :query OR description LIKE :query OR position LIKE :query OR notes LIKE :query OR notes LIKE :query OR buyer_id LIKE :query OR
display_type LIKE :query OR status LIKE :query", :query => "%#{params[:q]}%"])
@lots = @lots.merge(@property_lots)
@lots.uniq!
end
这个问题是它将activerecord:relation转换为一个数组,这会破坏我的分页,我后来添加的范围以及我的重新排序。有没有办法在不创建数组的情况下执行此操作?
答案 0 :(得分:2)
您可以在模型中定义一个方法,以使用关键字进行搜索:
def self.search_strategy(string)
string = "%#{string}%"
scope = self.includes(:properties)
scope = scope.where("lots.number ILIKE :q OR lots.title ILIKE :query OR lots.description ILIKE :query OR lots.notes ILIKE :q OR lots.position ILIKE :q OR ILIKE lots.buyer_id ILIKE :q OR lots.display_type ILIKE :q OR lots.status ILIKE :q OR properties.name ILIKE :q OR properties.value ILIKE :q", q: string)
scope
end
在你的控制器中使用它:
if params[:q]
@lots = Lot.search_strategy(params[:q])
end
更灵活的版本:
def self.search_strategy(string)
string = "%#{string}%"
conditions = []
['number', 'title', 'description', 'notes', 'position', 'buyer_id', 'display_type', 'status'].each do |column_name|
conditions << "lots.#{column_name} ILIKE :q"
end
['name', 'value'].each do |column_name|
conditions << "properties.#{column_name} ILIKE :q"
end
conditions = conditions.join(' OR ')
scope = self.includes(:properties)
scope = scope.where(conditions, q: string)
scope
end
使用上面的版本,您可以轻松添加/删除要搜索的列; - )
答案 1 :(得分:0)
这是一个“请原谅我即将做的可怕事情”的回答。
在@lots.uniq!
:
@lots = Lot.find(@lots.map(&:id))
Rails的身份地图缓存可能会让这不太可怕,但希望有人有更好的东西!!
看起来Rails 4中的身份地图已经消失了......哦。 :)
答案 2 :(得分:0)
if params[:q]
@lots = @lots.joins("LEFT JOIN properties ON properties.lot_id = lots.id").where(["lots.number LIKE :query OR lots.title LIKE :query OR lots.description LIKE :query
OR lots.notes LIKE :query OR lots.display_type LIKE :query OR lots.status LIKE :query OR properties.name LIKE :query OR properties.value LIKE :query", :query => "%#{params[:q]}%"])``
end
左连接修复它