【问题标题】:Delete in Many to Many Relationship Not Symmetric?在多对多关系中删除不是对称的?
【发布时间】:2012-09-07 20:42:09
【问题描述】:

我有两个模型,产品和类别,以及一个连接表,分类,用于多对多关系。

假设我有两个对象,产品和类别,它们是上述的实例。

products = Product.new(...)
category = Category.new(...)
product.categories << category

这成功地在 rails 控制台中创建了两个方向的关系,因此:

product.categories
category.products

都是非空的。下一个:

product.categories.delete category

将从产品对象和连接表中删除值。但是它不会从类别对象中删除它,因此:

category.products

非空,这意味着内存中的 category.products 对象与实际数据库不同步。对我来说,创建会对称地工作但删除不会。

以下是相关模型:

class Product < ActiveRecord::Base
  has_many :categorizations, dependent: :destroy
  has_many :categories, through: :categorizations, :uniq => true
end

class Category < ActiveRecord::Base
  has_many :categorizations, dependent: :destroy
  has_many :products, through: :categorizations, :uniq => true
end

class Categorization < ActiveRecord::Base
  belongs_to :product, class_name: "Product"
  belongs_to :category, class_name: "Category"

  validates :product, presence: true
  validates :category, presence: true
end

有什么想法吗?谢谢!

【问题讨论】:

  • 至于下面,我发现如果我通过 product = Product.find(product.id) 重新加载产品,那么 product.categories确实是[]。我不想每次引用一个对象时都要使用 X.find 来确保对象中的数据是有效的;是否有另一种方法可以确保对象通过删除保持最新?发布/订阅方法还是什么?

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

答案:它是 product.reload

这是我在数小时搜索后找到的第一个解释: https://stackoverflow.com/a/7449957/456280

【讨论】:

    【解决方案2】:

    您观察到的行为是 Rails 设计的行为方式。见Rails Guide on associations

    您可能还想查看有关 has_and_belongs_to_many (HABTM) 关联的部分。如果重命名连接表 categories_products,HABTM 将使您摆脱显式分类模型。

    【讨论】:

    • 嗨亚历克斯:感谢您的回复!我在这里发布之前阅读了该指南,但它并没有明确说明删除行为。那么如果我希望删除也是对称的,那么解决方案是什么?这对我来说没有多大意义,因为对称地创作作品。
    • 所以我意识到的一件事是使用 Product.find(product.id) 可以确保我拥有来自数据库的最新数据。出于这个原因,是否存在关于不使用内存对象的最佳实践,因为它们实际上会因基础数据的许多更改而失效?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    相关资源
    最近更新 更多