counter_cache没有更新has_one关联

时间:2013-10-27 02:21:35

标签: ruby-on-rails

我的Itemhas_onecanonical_item_id的关系。这应该在存在时返回canonical_item。这很好。

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

有什么想法吗?

2 个答案:

答案 0 :(得分: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关联,那么数据库结构不会允许ItemCanonicalItem个,因此它没有多大意义计算关联的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

答案 1 :(得分:0)

缓存计数器的字段为items_count而非items_counter

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