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不起作用?
当您使用将条件传递到 ActiveRecord 时,它实际上会尝试分析您传入的对象,它是字符串吗?数组?哈希?字符串、数组或散列中有什么?
在你的例子中,是一个哈希,所以它试图分析哈希中的内容,在第一个语句(有效)中,你传入一个模型实例作为值,所以它尝试查找是否有任何映射到的关联您指定的密钥,瞧,它找到了,一切都按计划进行
在第二种情况下,您传入 nil 作为值,现在,ActiveRecord 发现它是一个 nil 对象,因此它决定它不是关联。请注意,它不查看键,而只查看值,因此它尝试查找是否有任何映射到键的列,但找不到,返回错误
在最后一种情况下,您传入 nil 作为值,同样的事情,它试图找到映射到 :collection_id 的列,因此它在 SQL 语句中传入 nil 作为值,并且成功返回
所以这只是 ActiveRecord 采取的不幸的考虑因素,导致第二种情况不起作用 =)
希望这能澄清!=D
| 归档时间: |
|
| 查看次数: |
1139 次 |
| 最近记录: |