2011-12-09 9 views
11

joinsをARelスコープで使用すると、結果は読み取り専用になります。つまり、取得したレコードは更新できません。結果を読み取り専用にしたくない場合は、readonly(false)をスコープにチェーンするだけです(例:なぜ結合を使用するとARelスコープが読み取り専用になるのですか?

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

しかし、私は、デフォルトで参加し、スコープが読み取り専用されている理由があることが推測しています。結果を読み取り専用に設定する理由は何ですか?

答えて

1

興味深い質問。私は周りにグーグルをしていた.....ジョインのクエリでは、User +オーダーテーブルの属性を持つ単一のレコードを取得しています。 Userテーブルではなくorderテーブルの属性(たとえば "order_num")の1つを更新しようとすると、Userテーブルへのupdate文はorder_numを見つけることができずクラッシュします。そのため、結合スコープは既定で読み取り専用になっています。

参考文献: 1)http://blog.ethanvizitei.com/2009/05/joins-and-namedscopes-in-activerecord.html
2)Proper way to prevent ActiveRecord::ReadOnlyRecord?

+2

私の知る限り見ることができるように、 'SELECT'クエリのみユーザ属性を返します - それは' SELECTユーザーをやっているので、*ない*オーダー属性を。* FROM ... '。返されるActiveRecordオブジェクトには、理解できる限り順序属性は含まれてはいけません –

+0

私は元のモデルのコンテンツを返すだけです。デフォルトスコープでの結合を使用するのが難しくなります。 (たとえば、Orderが "非アクティブ"の場合、order_linesがデフォルトで返されないようにします)したがって、OrderLine default_scope {join(:order)}とOrder default_scope {where(アクティブ:true)}。 – TJChambers