在不使用sphinx或solr的情况下搜索多个活动记录模型

时间:2011-03-20 11:47:57

标签: ruby-on-rails search activerecord

在不使用sphinx或solr之类的情况下搜索多个活动记录模型的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

我使用IndexTank http://indextank.com/

答案 1 :(得分:2)

最简单的解决方案是从一个模型继承模型并将其存储在一个表中。但是,如果你有一个现有的架构或模型差别很大,那就太糟糕了。

另一个(我认为,更好)解决方案(如果您的数据库允许) - 在SQL中使用UNION从多个表中获取结果。在这种情况下,您应该使用find_by_sql

例如,如果您拥有PostQuestion模型,并希望将它们列在一个列表中(并按某些条件过滤它们,可能),您应该:

  • 为每个表添加字段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的每个实例都会有namelast_namereference_number属性,即使它们不是项目的属性。