Rails无法选择外键为零的位置

时间:2014-04-15 22:37:17

标签: ruby-on-rails activerecord null

我有一个带有CustomerShippingAddress模型的rails应用。它是通过一对多关系实现的,因此ShippingAddress可以拥有多个客户。

我成功地能够使用include语句查询这两个模型和其他几个模型,但是当我尝试更新查询以查找没有shipping_address得到0结果的所有客户时,甚至虽然我可以从我的数据库管理工具中找到我有多个客户,其中shipping_address_id的值为nil

这些查询有效,但没有给我没有地址的客户:

Customer.includes(:orders, :shipping_address).where('customers.name LIKE ? or customers.mail LIKE ?', searchstring, searchstring)

Customer.where('customers.shipping_address_id = ?',2)

这些尝试使上述内容适应没有添加的客户并不是

Customer.includes(:orders, :shipping_address).where('shipping_address = ?', nil)

Customer.includes(:orders, :shipping_address).where('shipping_address = NULL')

# At the very least I should be able to get the right result by referencing the fk directly, but no?
Customer.where('customers.shipping_address_id = ?',nil)   

我在这里缺少什么?

3 个答案:

答案 0 :(得分:1)

在您习惯之前,NULL值可能会令人惊讶。从概念上讲,NULL表示“缺少未知值”,并且与其他值的处理方式略有不同。

您无法使用等于null来比较null,您必须使用IS NULL。因此,请将您的查询更新为

Customer.includes(:orders, :shipping_address).where('customers.shipping_address_id IS NULL')

或者这样做的轨道方式是

Customer.where(shipping_address_id: nil).includes(:orders, :shipping_address)

答案 1 :(得分:1)

您也可以这样做:

@customers_without_shipping_ids = Customer.where('shipping_address_id IS NULL').all

答案 2 :(得分:1)

请试试这些查询

Customer.all(:conditions => ['shipping_address_id IS NULL'])

Customer.includes(:orders, :shipping_address).where('shipping_address_id IS NULL')