我目前正在使用Rails 2.3.9.我知道:joins在没有显式的查询中指定选项会:select自动生成任何以只读方式返回的记录.我有一个情况,我想更新记录,虽然我已经阅读了不同的方法,我想知道哪种方式是首选或"正确"的方式.
具体来说,我的情况是我有User一个带有active命名范围的以下模型,该范围与subscriptions表执行JOIN :
class User < ActiveRecord::Base
has_one :subscription
named_scope :active, :conditions => { :subscriptions => { :status => 'active' } }, :joins => :subscription
end
Run Code Online (Sandbox Code Playgroud)
当我调用时User.active.all,返回的用户记录都是只读的,因此,例如,如果我调用update_attributes!用户,ActiveRecord::ReadOnlyRecord则会引发用户记录.
通过阅读各种来源,似乎一种流行的解决方法是添加:readonly => false到查询中.但是,我想知道以下内容:
SELECT `users`.*,这似乎是安全的,那么Rails首先想要防范什么呢? 看起来Rails应该防范:select实际明确指定的情况,这与实际行为相反,所以我没有正确理解自动设置只读标志的目的:joins吗?:readonly => false.如果命名范围与其他命名范围链接,我也害怕副作用.如果我尝试在范围之外指定它(例如,通过执行User.active.scoped(:readonly => false)或User.scoped(:readonly => false).active),它似乎不起作用.我读过的另一种解决方法是将其更改:joins为 …