2014-01-15 8 views
0

has_many through: 관계가있는 ActiveRecord 개체를 캐시하려고하면 다시로드하거나 저장할 때까지 개체를 캐시 할 수 없습니다.has_many 통해 ActiveRecord 개체 캐시 :

person.rb :

class Person < ActiveRecord::Base 
    attr_accessible :name 

    has_many :person_locations 
    has_many :locations, through: :person_locations 

    has_many :person_items 
    has_many :items, through: :person_items 
end 

person_item.rb :

class PersonItem < ActiveRecord::Base 
    attr_accessible :item_id, :person_id 

    belongs_to :item 
    belongs_to :person 
end 

item.rb :

class Item < ActiveRecord::Base 
    attr_accessible :description 

    has_many :person_items 
    has_many :people, through: :person_items 
end 

콘솔 :

p = Person.create 
p.items << Item.create 
Rails.cache.write Time.now, p 
=> false 

#now if I save or reload p 
p.save # or p.reload 
Rails.cache.write Time.now, p 
=> truthy 

Marshal 단계에서 실패합니다. 따라서 Marshal.dump(p)TypeError: can't dump hash with default proc 오류로 인해 실패합니다.

pcreate 대신 new을 사용하여 만들면 캐시에 쓸 수 있습니다.

p = Person.new 
p.items << Item.new 
Rails.cache.write Time.now, p 

ActiveRecord 개체를 캐시하는 것이 실패한 이유는 무엇입니까?

레일 : 3.2.14

크루즈 : 2.7

루비 : 1.9.3-p392

도 참조 편집 : Dalli: You are trying to cache a Ruby object which cannot be serialized to memcached

답변