我的Item
与has_one
有canonical_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
有什么想法吗?
答案 0 :(得分:1)
如果这是因为您的has_one
和belongs_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
关联,那么数据库结构不会允许Item
多CanonicalItem
个,因此它没有多大意义计算关联的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
。
确保数据库中存在该字段。