在不使用sphinx或solr之类的情况下搜索多个活动记录模型的最佳方法是什么?
答案 0 :(得分:3)
我使用IndexTank http://indextank.com/
答案 1 :(得分:2)
最简单的解决方案是从一个模型继承模型并将其存储在一个表中。但是,如果你有一个现有的架构或模型差别很大,那就太糟糕了。
另一个(我认为,更好)解决方案(如果您的数据库允许) - 在SQL中使用UNION从多个表中获取结果。在这种情况下,您应该使用find_by_sql
。
例如,如果您拥有Post
和Question
模型,并希望将它们列在一个列表中(并按某些条件过滤它们,可能),您应该:
为每个表添加字段type
,默认值与模型名称匹配。例如:
create_table :questions do |t|
t.text :text
t.string :type, :null => false, :default => 'Question'
t.timestamps
end
按以下方式查询两个模型:
Post.find_by_sql("SELECT id,type,created_at,updated_at,title,description,NULL AS text FROM posts
UNION SELECT id,type,created_at,updated_at,NULL as title, NULL AS description, text FROM questions
ORDER BY created_at DESC")
使用type
字段Rails将区分不同的模型并返回Post和Question的列表,因此您可以搜索(或分页)两者。
答案 2 :(得分:0)
假设您正在使用关系数据库,编写原始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
属性,即使它们不是项目的属性。