为什么使用连接时ARel范围变为只读?

Tho*_*son 11 activerecord arel

如果您joins在ARel范围内使用,则结果将变为只读(即您无法更新您获得的任何记录).如果您不希望结果是只读的,那么您只需链接readonly(false)到范围,例如

User.joins(:orders).where(:orders => { :state => 'completed' }).readonly(false)

但我猜测默认的连接范围是只读的有一个原因.将结果设置为只读的原因是什么?

小智 1

有趣的问题。我正在谷歌搜索......通过联接查询,您将返回带有用户+订单表属性的单个记录。如果您尝试更新订单表而不是用户表中的属性之一(例如“order_num”),则用户表的更新语句将无法找到 order_num 并且会崩溃。因此,连接范围默认是只读的,以防止这种情况发生。

参考文献:1)http://blog.ethanvizitei.com/2009/05/joins-and-namedscopes-in-activerecord.html
2) 防止ActiveRecord::ReadOnlyRecord的正确方法?

  • 据我所知,“SELECT”查询仅返回用户属性 - *不*订单属性,因为它正在执行“SELECT users.* FROM ...”。因此,据我所知,返回的 ActiveRecord 对象不应包含任何订单属性 (2认同)