我的问题是如何在限制查询数量的同时对数据库执行不同级别的搜索。
让我们简单地开始:
@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。
它不会比您已经在做的事情得到更多的优化。在您尝试迭代结果之前,这些语句中完全没有一个会执行SQL查询。执行查询时将调用all
、first
、inspect
、any?
、each
等方法。
每次在一个新的where
或其他arel方法上链接时,它都会附加到将在最后执行的sql查询中。如果在中间的某个位置,您想查看将要执行的查询,则可以执行puts @searchcompanies.to_sql
请注意,如果在控制台中运行这些命令,则每条语句似乎只是运行SQL查询,因为控制台会自动在您输入的行上运行.inspect
。
希望我回答了你的问题:)
这里有一个很棒的铁路清洁工:http://railscasts.com/episodes/239-activerecord-relation-walkthrough它解释了ActiveRelation是如何工作的,以及你可以用它做什么
编辑:
我可能误解了你的问题。您表示,在每次where
调用后,都会显示查询中的信息。这个用例是什么?您是否在从搜索中筛选出公司的同一页面上显示所有公司?如果你显示了第一个查询中的内容,那么你将从数据库中提取每一个公司行(在大量的公司条目中,这将不是非常可扩展或性能)。
只显示来自@searchcompanies
变量的信息是否有意义?