在Rails查询中指定条件包括不工作

时间:2016-01-31 20:46:02

标签: mysql ruby-on-rails activerecord eager-loading

我真的陷入了一件非常简单的事情。我无法在包含活动记录查询中指定条件。 以下是我的代码,说明我的问题。

2.2.1 :072 > visitor = Visitor.includes(:campaign).first
2.2.1 :073 > visitor.campaign.merchant_id
 => 123456

上述案例运作良好。 现在,当我尝试以下操作时,它失败了。

2.2.1 :076 > visitor = Visitor.includes(:campaign).where("campaign.merchant_id = 123456").references(:campaign).first
ERROR -- : Mysql2::Error: Unknown column 'campaign.merchant_id' in 'where clause'

非常感谢任何帮助。仅供参考。 Campaign有很多访客 访客属于广告系列 Campaign有一个属性merchant_id,我用它来指定条件。

1 个答案:

答案 0 :(得分:3)

您的表名不是campaigns而不是campaign吗? Rails只是将字符串直接传递给SQL,因此它尝试查找表campaign。假设您正在使用标准轨道复数化,那么在这种情况下表格名称是错误的。

扩展答案:您的错误是MySQL错误,而不是来自rails。这意味着您的ruby代码在没有错误的情况下进行了解析,因此您需要在rails下面一步 - 即在数据库中。从错误消息中,您可以看到问题存在于SQL WHERE子句中。您可以查看您尝试使用

运行的SQL
Visitor.includes(:campaign).where("campaign.merchant_id = 123456").to_sql

会显示类似

的内容
SELECT * from 'visitors' INNER JOIN campaigns
WHERE campaign.merchant_id = 123456

如果您尝试在MySQL提示符下运行该SQL,则会从数据库中获得相同的“未知列”错误。原因是MySQL试图找到一个名为campaign.merchant_id的列,该列不存在,因为表部分(campaign)不存在。

如果您将ruby代码更改为where('campaigns.merchant_id = 123456'),它应该可以正常工作。

然而,更好的是完全留在红宝石中并使用these instruction

Visitor.includes(:campaign).where(:campaigns => {:merchant_id => 123456})