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

发布于 2024-10-24 13:22:13 字数 51 浏览 3 评论 0原文

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

What's the best way of searching across multiple active record models without using something like sphinx or solr?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

独行侠 2024-10-31 13:22:13

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

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

例如,如果您有 PostQuestion 模型,并且希望将两者列出在一个列表中(并根据可能的某些条件过滤它们),您应该:

  • 添加字段键入到每个表,默认值与模型名称匹配。例如:

    create_table :问题 |t|
      t.文本:文本
      t.string :type, :null =>假,:默认=> '问题'
    
      t.时间戳
    结尾
    
  • 按如下方式查询两个模型:

    Post.find_by_sql("从帖子中选择 id,type,created_at,updated_at,title,description,NULL AS 文本 
      UNION SELECT id,type,created_at,updated_at,NULL 作为标题,NULL AS 描述,问题文本 
      按 DESC 创建的订单")
    

使用 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 and Question 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:

    create_table :questions do |t|
      t.text :text
      t.string :type, :null => false, :default => 'Question'
    
      t.timestamps
    end
    
  • Query both models as following:

    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")
    

Using type field Rails will distinguish different models and return list of both Post and Question, so you may search (or paginate) for both.

你又不是我 2024-10-31 13:22:13

假设您使用的是关系数据库,编写原始 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 属性,即使它们并不是项目的真正属性。

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 of Item returned would have a name, last_name and reference_number attribute even though they are not really attributes of an Item.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文