在不使用 sphinx 或 solr 的情况下搜索多个活动记录模型
在不使用 sphinx 或 solr 之类的情况下搜索多个活动记录模型的最佳方法是什么?
What's the best way of searching across multiple active record models without using something like sphinx or solr?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我使用 IndexTank http://indextank.com/
I use IndexTank http://indextank.com/
最简单的解决方案是从模型继承模型并将其存储在一张表中。但是,如果您有现有架构或模型差异很大,那就非常糟糕了。
另一个(我认为更好的)解决方案(如果您的数据库允许)- 在 SQL 中使用 UNION 从多个表中获取结果。在这种情况下,您应该使用
find_by_sql
。例如,如果您有
Post
和Question
模型,并且希望将两者列出在一个列表中(并根据可能的某些条件过滤它们),您应该:添加字段
键入
到每个表,默认值与模型名称匹配。例如:按如下方式查询两个模型:
使用
type
字段 Rails 将区分不同的模型并返回 Post 和 Question 的列表,因此您可以搜索(或分页)两者。The simplest solution is to inherit models from the one and to store it in one table. However it's very bad if you have an existent schema or if models differs much.
Another (and i think, much better) solution (if your database allow it) - to use UNION in your SQL to get results from multiple tables. In this case you should use
find_by_sql
.For example, if you have
Post
andQuestion
models and want to list both in one list (and filter them by some conditions, possible) you should:Add field
type
to each table with default value matching model name. For example:Query both models as following:
Using
type
field Rails will distinguish different models and return list of both Post and Question, so you may search (or paginate) for both.假设您使用的是关系数据库,编写原始 SQL 语句可能是您最好的选择。
看看 http://api.rubyonrails.org/classes /ActiveRecord/Base.html#method-c-find_by_sql
Item.find_by_sql("SELECT items.name, users.last_name, products.reference_number ... JOIN... ")
。 ..将返回
Item
的集合,但包含 SQL 查询返回的属性。因此,在上面的示例中,返回的每个Item
实例都将具有name
、last_name
和reference_number
属性,即使它们并不是项目的真正属性。Assuming you are using a relational database, writing raw SQL statements is probably your best bet.
Take a look at http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-c-find_by_sql
Item.find_by_sql("SELECT items.name, users.last_name, products.reference_number ... JOIN... ")
...would return a collection of
Item
but with the attributes returned by the SQL query. So in the above example each instance ofItem
returned would have aname
,last_name
andreference_number
attribute even though they are not really attributes of an Item.