ActiveRecord .joins 打破其他查询

ActiveRecord .joins breaking other queries

我正在一个包含大量表的遗留数据库之上编写 Rails API。搜索功能使用户能够查询分布在 13 个表中的大约 20 个单独的列。我有许多查询会检查参数以查看它们是否需要 return 结果。它们看起来像这样:

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?    

突然间,我的第一组查询开始 returning null,而不是他们returning 的 ID 列表。无论其他查询是否正常运行,带有连接的查询都能很好地工作。当我注释掉连接查询时,之前的查询再次开始工作。带有联接的查询是否会破坏页面上的其他查询?

我想不出加入会破坏您之前的查询的具体原因,但是我确实对您的查询总体上有一些建议。

假设您已经正确地为这些关系建模,您应该不需要手动定义连接。另一方面,您根本没有查询公司,因此您可以使用包含而不是连接 - 这将允许您访问其数据而无需触发另一个查询。

如果您想访问公司数据(即 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/ - 它们有时绝对是救命稻草!

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