我真的陷入了一件非常简单的事情。我无法在包含活动记录查询中指定条件。 以下是我的代码,说明我的问题。
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,我用它来指定条件。
答案 0 :(得分:3)
您的表名不是campaigns
而不是campaign
吗? Rails只是将字符串直接传递给SQL,因此它尝试查找表campaign
。假设您正在使用标准轨道复数化,那么在这种情况下表格名称是错误的。
扩展答案:您的错误是MySQL错误,而不是来自rails。这意味着您的ruby代码在没有错误的情况下进行了解析,因此您需要在rails下面一步 - 即在数据库中。从错误消息中,您可以看到问题存在于SQL WHERE
子句中。您可以查看您尝试使用
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})