ActiveRecord .joins打破其他查询

时间:2015-01-20 23:10:56

标签: ruby-on-rails activerecord

我在拥有大量表格的旧数据库上编写Rails API。搜索功能使用户能够查询分布在13个表中的20个独立列。我有许多查询检查参数,看看他们是否需要返回结果。它们看起来像这样:

results << Company.where('city LIKE ?', "#{params[:city]}").select('id') unless params[:city].blank?    

他们工作正常。但是,我刚刚添加了另一个看起来像这样的查询:

results << Company.joins("JOIN Contact ON Contact.company_id = Company.id").where("Contact.first_name LIKE ?", "%#{params[:first_name]}%").select('company_id') unless params[:first_name].blank?    

突然我的第一组查询开始返回null,而不是他们返回的ID列表。无论其他查询是否有效,带有连接的查询都能很好地工作。当我对连接查询进行注释时,之前的查询将再次开始工作。是否有某些原因使用连接查询会破坏页面上的其他查询?

2 个答案:

答案 0 :(得分:0)

我无法想到为什么加入会破坏您之前的查询,但我确实对您的查询提出了一些建议。

假设您已正确建模这些关系,则不需要手动定义连接。另外,您根本不会查询公司,因此您可以使用包含而不是连接 - 这将允许您访问其数据而不会触发其他查询。

如果您想访问公司数据(即query.company.name),请使用如下所示的包含:

Contact.includes(:company).where('first_name LIKE ?', param).select(:company_id).distinct

然而,你真正想要的只是一系列ID(存在于联系人模型中),因此你可以放松一下而不包括公司。

Contact.where('first_name LIKE ?', param).select(:company_id).distinct

每当你遇到困难时,永远不要忘记在http://api.rubyonrails.org/查看大量资源 - 有时它们绝对是一个救生员!

答案 1 :(得分:0)

事实证明,带连接的查询需要放在没有连接的查询之上。我不确定它为什么会这样,但希望这有助于其他人。