1

Item我正在编写一个搜索查询,用户可以按创建者、标题或描述或以上任何组合搜索s。

因此,在我的搜索控制器逻辑中,我因此获取了参数:

creator = params['creator']
title = params['title']
description = params['description']
# todo: do some input validation here
results = nil
cr = User.roughly_named(creator).first

我现在正在做的是:

q = []
q << "creator_id IS #{cr.id}" if cr
q << "title LIKE '%#{title}%'" if title != ''
q << "description LIKE '%#{description}%'" if title != ''
results = Item.where(q.join(' AND ')

但肯定有更好的方法。我愿意接受建议。

4

2 回答 2

5

如何使用范围

res = Item.scoped

res = res.where(["creator_id is ?", cr.id]) if cr
res = res.where(["title like ?", "%#{title}%"]) unless title.empty?
res = res.where(["description like ?", "%#{description}%"]) unless description.empty?

做的时候Item.scoped,你基本上是做延迟加载。迭代res将实际执行查询。这在链接可选 where 子句时很方便。

PS:更喜欢?语法以防止 SQL 注入。

于 2013-06-25T09:28:54.287 回答
1

where您可以使用常规子句简单地实现这一点

或者尝试动态查找器?如果这也没有帮助,您可以使用method_missing创建动态方法调用。在别处有解释

于 2013-06-25T09:34:54.777 回答