2017-12-27 23 views
4

私はライセンスを持っているRuby on Railsアプリケーションを持っています。ライセンスが付いているアイテムと、その2つをリストしたテーブル(ライセンスにはどのアイテムが入っていますか?ショッピングカート内のアイテムと同様です。Ruby on Railsのスコープとの関連

一部の商品は販売されなくなりますが、データベースに保管する予定です。 soft-deleteを作成し、テンプレートとリレーションシップのデフォルトスコープを使用しました。しかし、私は、関連するテンプレートを使用して、既存のレコードを変更しようとすると、私は例外を取得:ActiveRecord :: ReadOnlyRecord

マイテンプレートは次のようになります。このように

class Item <ActiveRecord :: Base 
    default_scope {where (deleted: false)} 
end 

class LicenseItem <ActiveRecord :: Base 
    belongs_to: license, touch: true 
    belongs_to: item 
end 

class License <ActiveRecord :: Base 
    has_many: license_items, 
      -> {joins (: item) .where (items: {deleted: false})}, 
      dependent:: destroy 
end 

pry (main)> License.find (0) .license_items [0] .readonly? 
=> true 

いずれかがあります読書だけでなく、この関係を作る方法?

has_manyスコープの最後にreadonly (false)を追加して、すでにLicenseに追加しようとしました。

+0

これはあなたに少し役立つかもしれません:https://github.com/rails/rails/issues/10615。 Rails 3.xでは、 'join 'を使用すると暗黙の読み取り専用があるように見えます。 Rails 4以降では、これは削除されたようです。しかし、その問題によれば、 'readonly(false)'が推奨される方法です。それはあなたのために働いていない奇妙です。 –

+1

ソフト削除の場合、https://github.com/rubysherpas/paranoia gemは便利な機能を提供します。 –

+0

ありがとう、私はその宝石を見て:) – MZaragoza

答えて

5

this thread in GitHubによると、これはバージョン4.0.1で修正されたRails 4.0バグです。あなたのRailsの更新、あなたの範囲にreadonly (false)を含むことができ、それが動作します:

class License <ActiveRecord :: Base 
    has_many: license_items, 
      -> {joins (: item) .where (items: {deleted: false}). readonly (false)}, 
      dependent:: destroy 
end 

を、Railsのバージョンを更新し、あなたのGemfileを編集しbundle updateを実行します。後者の場合

あなたはRailsのバージョンを更新することができない場合、あなたはfind(推奨されません)メソッドにreadonly: falseオプションを渡すことができます:

License.find (1) .license_items.find (1, readonly: false) .update_attributes (amount: 5)