6

私はこのようなものを持っています:

class Suite < ActiveRecord::Base
  has_many :tests
end

class Test < ActiveRecord::Base
  belongs_to :suite
end

また、フラグメント キャッシュを行うために cache_digests gem を使用しています。Suite オブジェクトを更新すると、子テストのキャッシュの有効期限が切れます。関連付けに を入れようとしましたtouch: trueが、has_many成功しませんでした。

どうやってやるの?

前もって感謝します


編集

私は次のようにキャッシュを行っていました:

<% cache test do %>
  <tr>
   etc...
    <% cache test.suite do %>
      etc..
    <% end %>
  </tr>
<% end %>

しかし、スイートを編集するとき、それらのテストは変更されないため、うまくいきません。そこで、キャッシュ宣言を次のように変更しました。

<% cache [test, test.suite] do %>
   etc..
<% end %>

そして、それは期待どおりに機能しました。

テストまたはスイートを編集すると、そのうちの 1 つが変更されるため、フラグメントが期限切れになり、期待どおりに新しいバージョンが取得されました。

助けてくれた@taryn-eastに感謝します。

4

5 に答える 5

4

そうです、人間関係でtouch: trueは機能しません。フックをhas_many使用して、関連するすべてのアセットを手動で更新できます。after_save例えば...

class Post < ActiveRecord::Base
  has_many :assets
  after_save :touch_assets

  def touch_assets
    assets.update_all(updated_at: Time.now)
    # This does a single SQL call, but bypasses ActiveRecord in the process. See warning below.
    # SQL> UPDATE "assets" SET "updated_at" = '2014-03-25 22:37:55.208491' WHERE "assets"."post_id"  [["post_id", 2]]
  end
end

class Asset < ActiveRecord::Base
  belongs_to :post
end

警告:これは、アセットの更新時に ActiveRecord をバイパスするため、アセットが別のオブジェクトに触れる必要がある場合、これは機能しません。touch_assetsただし、アセットが更新するはずだったオブジェクトを更新するメソッドに、追加のロジックを追加することもできます。しかし、これは面倒になり始めます。

于 2014-03-25T22:56:32.580 に答える
3

このページ: https://github.com/rails/rails/issues/8759

after_save フックの使用を提案します。

class Post < ActiveRecord::Base
  has_many :assets
  after_save -> { self.touch }
end

class Asset < ActiveRecord::Base
  belongs_to :post
end
于 2013-02-26T00:14:13.240 に答える
-2

追加する必要があります

autosave: true 

親に子を強制的に更新させたい場合は、has_many アソシエーションで。touch は、子 -> 親の更新に使用されます。

于 2013-07-21T04:49:20.687 に答える
-5

これを試して

    class Suite < ActiveRecord::Base
      has_many :tests
    end

    class Test < ActiveRecord::Base
      belongs_to :suite, :touch => true
    end
于 2013-09-23T10:39:23.477 に答える