2011-06-06 66 views
0

我的问题是关于如何在限制查询次数的同时对数据库执行不同级别的搜索。在没有第二个查询的情况下搜索关系

让我们从简单的开始:

@companies = Company.where("active = ?", true) 

比方说,我们从这组显示的记录。然后,我们需要:

@clientcompanies = @companies.where("client_id = ?", @client.id) 

我们会显示@clientcompanies的内容。然后,我们想进一步深入。

@searchcompanies = @clientcompanies.where("name LIKE ? OR notes LIKE ?", "#{params[:search]}%", "#{params[:search]}%") 

这三个陈述是最有效的方法去做这件事吗?

如果实际上数据库每次都是从整个公司表格开始的,是否有限制范围的方法,以便每个上述语句随着集合大小的减少需要更短的时间?

万一它很重要,我在MySQL和PostgreSQL上运行Rails 3。

回答

0

它没有得到更多的优化,那么你已经在做什么。这些语句的恰好为零将执行SQL查询,直到您尝试遍历结果为止。调用方法如all,first,inspect,any?,each等将在查询执行时执行。

每次链接新的where或其他arel方法时,它都会附加到它将在最后执行的sql查询。如果在中间的某个地方想要查看将要执行的查询,您可以执行以下操作:puts @searchcompanies.to_sql

请注意,如果您在控制台中运行这些命令,则每个语句似乎仅运行SQL查询,因为控制台会自动运行.inspect在您输入的行上。

希望我回答你的问题:)

这里有一个很大的railscast:http://railscasts.com/episodes/239-activerecord-relation-walkthrough解释ActiveRelation是如何工作的,你可以用它做什么。

编辑:

我可能误解了你的问题。您表示在每次调用where之后,您都会显示查询中的信息。这有什么用途?您是否在同一页面上显示所有公司,并且已经从搜索中滤除了公司?如果您从第一个查询中显示某些内容,那么您将从数据库中提取每一个公司行(这对于大量公司条目来说不具有可扩展性或性能)。

只显示@searchcompanies变量的信息没有意义吗?

+0

我的用例显示来自这些不同级别的查询的数据很简单 - 想象一个通过一些数据'钻取'的页面,并向用户显示关于每个级别的详细信息。比方说,我想向用户展示一些样本'公司',然后是一些样本'客户公司'​​,以及用户的实际搜索。我的问题取决于这种情况,我需要做这些查询,但我想尽可能轻松地做到这一点。 – sscirrus 2011-06-16 06:23:35

相关问题