Rails:为什么不能在where子句中将关联设置为nil?

And*_*rew 9 activerecord ruby-on-rails where ruby-on-rails-3

我有照片属于收藏和用户.照片始终属于用户,但可能未分配给集合.

在我的控制器中,这完美地工作:

@collection_photos = Photo.where( :collection => @collection, :user => current_user )
Run Code Online (Sandbox Code Playgroud)

但是,这失败了......

@other_photos = Photo.where( :collection => nil, :user => current_user )
Run Code Online (Sandbox Code Playgroud)

......但这有效:

@other_photos = Photo.where( :collection_id => nil, :user => current_user )
Run Code Online (Sandbox Code Playgroud)

当集合设置为nil时,我收到以下错误消息:No attribute named 'collection' exists for table photos.

如果我传递一个对象,它知道collection_id从符号中搜索:collection,但如果我没有传递一个对象,它似乎并不知道该关联.

我理解正确吗?任何人都可以解释一下为什么:collection=>nil不起作用?

Sta*_*len 3

当您使用将条件传递到 ActiveRecord 时,它实际上会尝试分析您传入的对象,它是字符串吗?数组?哈希?字符串、数组或散列中有什么?

在你的例子中,是一个哈希,所以它试图分析哈希中的内容,在第一个语句(有效)中,你传入一个模型实例作为值,所以它尝试查找是否有任何映射到的关联您指定的密钥,瞧,它找到了,一切都按计划进行

在第二种情况下,您传入 nil 作为值,现在,ActiveRecord 发现它是一个 nil 对象,因此它决定它不是关联。请注意,它不查看键,而只查看值,因此它尝试查找是否有任何映射到键的列,但找不到,返回错误

在最后一种情况下,您传入 nil 作为值,同样的事情,它试图找到映射到 :collection_id 的列,因此它在 SQL 语句中传入 nil 作为值,并且成功返回

所以这只是 ActiveRecord 采取的不幸的考虑因素,导致第二种情况不起作用 =)

希望这能澄清!=D