如果您在ARel作用域中使用joins
,則結果將變爲只讀(即,您無法更新您返回的任何記錄)。如果您不希望結果爲只讀,您只需將readonly(false)
鏈接到範圍,例如,爲什麼ARel作用域在使用連接時變爲只讀?
User.joins(:orders).where(:orders => { :state => 'completed' }).readonly(false)
,但我想有就是參加的範圍在默認情況下是隻讀的一個原因。將結果設置爲只讀的原因是什麼?
如果您在ARel作用域中使用joins
,則結果將變爲只讀(即,您無法更新您返回的任何記錄)。如果您不希望結果爲只讀,您只需將readonly(false)
鏈接到範圍,例如,爲什麼ARel作用域在使用連接時變爲只讀?
User.joins(:orders).where(:orders => { :state => 'completed' }).readonly(false)
,但我想有就是參加的範圍在默認情況下是隻讀的一個原因。將結果設置爲只讀的原因是什麼?
有趣的問題。我一直在Google上搜索.....通過一個連接查詢,您可以使用User + Order表屬性獲取單個記錄。如果您試圖更新訂單表中的某個屬性(如「order_num」)而不是User表,則User表的更新語句將無法找到order_num並且會崩潰。因此,默認情況下,聯合範圍是只讀的,以防止發生這種情況。
參考文獻: 1)http://blog.ethanvizitei.com/2009/05/joins-and-namedscopes-in-activerecord.html
2)Proper way to prevent ActiveRecord::ReadOnlyRecord?
據我所看到的,'SELECT'查詢只返回用戶屬性 - *不*屬性的順序,因爲它做一個'SELECT用戶* FROM ...'。所以返回的ActiveRecord對象不應該包含任何訂單屬性,據我所知 –
我也看到它只是返回原始模型的內容。它使得在默認範圍內使用連接變得困難。我使用默認範圍內的連接來過濾基於分層模型生態系統的非活動記錄(例如,如果Order是「inactive」,那麼order_lines不應該默認返回,因此OrderLine的default_scope {joins(:order)}和Order default_scope {where(active:true)}。 – TJChambers