ruby-on-rails - ActiveRecord - has_many :through, :dependent => :destroy sql 不正确

标签 ruby-on-rails activerecord many-to-many

我正在尝试“计数器缓存”每个标签中的帖子数量。保存后回调有效,但销毁后无效。看起来 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}

最佳答案

我遇到了完全相同的问题,对我来说,解决方法是在连接表中添加一个主键列(在您的情况下为 PostTag)。

似乎 rails 需要 :dependent => :destroy 的主键工作的选择。

关于ruby-on-rails - ActiveRecord - has_many :through, :dependent => :destroy sql 不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9911078/

相关文章:

ruby-on-rails - 如何为子文件夹中的对象提供服务

asp.net-core - 如何在 EF Core 上创建自定义导航属性

python - 避免在多对多 rel SQLAlchemy 中检索要删除的对象

ruby-on-rails - 使用 Arel 表达 CTE

ruby-on-rails - 如何避免在 ActiveStorage 中接受损坏的图像?

mysql - 从 db : how to consider only date in datetime field? 中检索数据

ruby-on-rails - 如何使用 ActiveRecord 仅选择存储在 Postgres 中的部分 json

ruby-on-rails - 通过初始化程序向 ActiveRecord::Base 添加范围?

python - Django 使用包含过滤多对多

ruby-on-rails - Heroku 部署上的 RAILS_MASTER_KEY 错误