各タグの投稿の数を「カウンタキャッシュ」しようとしています。アフターセーブコールバックは機能していますが、after destroyは動作していません。破壊SQLのように見えるが正しくありません。ActiveRecord - has_many:through、:dependent =>:destroy SQLが正しくありません。
class Post < ActiveRecord::Base
has_many :post_tags, :dependent => :destroy
has_many :tags, :through => :post_tags
end
class Tag < ActiveRecord::Base
has_many :post_tags, :dependent => :destroy
has_many :posts, :through => :post_tags
end
class PostTag < ActiveRecord::Base
self.table_name = :posts_tags
belongs_to :post
belongs_to :tag
after_save :update_tag_posts_count
after_destroy :update_tag_posts_count
def update_tag_posts_count
tag.posts_count = tag.posts.count
tag.save
end
end
テストが
# @tag.posts_count == 10
Failure/Error: @tag.posts.first.destroy
ActiveRecord::StatementInvalid:
Mysql2::Error: Unknown column 'posts_tags.' in 'where clause': DELETE FROM `posts_tags` WHERE `posts_tags`.`` = NULL
を失敗し、正しいSQLは、私が数+保存使用して別々のインクリメント/デクリメント機能を示唆していないと思います
DELETE FROM `posts_tags` WHERE `posts_tags`.`post_id` = {the post id}
table_name =の代わりにset_table_nameを使用してみてください。私は、メソッドset_table_nameがもう少し変わると思います。 –
@joe Pymそれは動作しませんでした。さらに、set_table_nameは廃止予定です。 - > DEPRECATION警告:set_table_nameの呼び出しは非推奨です。代わりに 'self.table_name = 'the_name''を使用してください。 – Marcelo
私の状況で非常に似たエラーが発生しています。私も答えが欲しいです。 – user1149547