0

Itemhas_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

何か案が?

4

2 に答える 2

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関連付けである場合、DB 構造では 1 つ以上を許可しない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
于 2013-10-27T05:18:20.053 に答える
0

キャッシュ カウンターのフィールドは ではありitems_countませんitems_counter

フィールドがデータベースに存在することを確認してください。

于 2013-10-27T04:33:08.613 に答える