2013-10-27 57 views
0

我有一个Item,与canonical_item_id的关系为has_one。这应该在出现时返回canonical_item。这工作正常。counter_cache在has_one关联上没有更新

has_one :canonical_item, class_name: "Item", foreign_key: :id, primary_key: :canonical_id 
belongs_to :canonical_item, counter_cache: true 

我尝试设置belongs_to :canonical_item, counter_cache: true更新canonical_item.items_counter计数器,但它没有更新。我还注意到,当我加入时我失去了联系cannonical_item

Item.last.canonical_item 
=> nil 

任何想法?

回答

0

缓存计数器的字段是items_count而不是items_counter

确保该字段存在于您的数据库中。

+0

它已经是'items_count'。 – Martin

+0

尝试将'belongs_to'符号重命名为与'has_one'不同。他们似乎都是'canonical_item'。 – Roganartu

1

如果这是因为您的has_onebelongs_to关联的方法和/或回调互相重叠,我不会感到惊讶。不过,这似乎是一个不太可能的情况,你需要这两种。

如果你需要的是一个belongs_to协会:

create_table :items do |t| 
    t.integer :canonical_item_id 
end 

create_table :canonical_items do |t| 
    t.integer :items_count, :default => 0 
end 

class Item < ActiveRecord::Base 
    belongs_to :canonical_items, :counter_cache => true 
end 

class CanonicalItem < ActiveRecord::Base 
    has_many :items, :dependent => :nullify 
end 

如果你需要的是一个has_one协会,DB结构,因为它是不会允许一个CanonicalItem多个Item,所以它不记录相关联的Item记录没什么意义。您可以简单地检查是否有值:item_id

create_table :items do |t| 
end 

create_table :canonical_items do |t| 
    t.integer :item_id 
end 

class Item < ActiveRecord::Base 
    has_one :canonical_item, :dependent => :nullify 
end 

class CanonicalItem < ActiveRecord::Base 
    belongs_to :item 
end