在Rails 5

时间:2018-01-15 03:34:21

标签: ruby-on-rails ruby-on-rails-5

我有products模型和variations模型作为belongs_to关联。有些变体绝对属于单一产品,但还有其他变体属于许多产品。我可以像belongs_to关联一样在has_and_blongs_to_many关联上创建联接表吗?

我的模特目前

product.rb

class Product < ApplicationRecord
  has_many :variations, dependent: :destroy
  has_and_belongs_to_many :categories
  has_and_belongs_to_many :subcategories

  include FriendlyId
  friendly_id :name, use: :slugged

  def should_generate_new_friendly_id?
    name_changed?
  end
end

variation.rb

class Variation < ApplicationRecord
    has_and_belongs_to_many :categories
    has_and_belongs_to_many :subcategories
    belongs_to :product

    include FriendlyId
    friendly_id :name, use: :slugged

    def should_generate_new_friendly_id?
        name_changed?
    end
end

1 个答案:

答案 0 :(得分:1)

来自Rails guides association basics - the belongs_to association

  

belongs_to关联与另一个模型建立一对一的连接,这样声明模型&#34;的每个实例都属于&#34;另一个模型的一个实例。

当您在belong_to :product模型上执行Variation关联时,它希望有一个名为product_id的字段,该字段将指向相关产品。

使用示例:

variation = Variation.first
product = variation.product # this line will get the product which is associated to the variation by the product_id column.

由于它只能容纳一个整数(一个产品ID),因此最佳选择是重构代码。使用&#34; belongs_to&#34;是没有意义的。 as&#34; has_many&#34;关联。

您需要将关联更改为多对多关联的王者。

要为您选择最佳选项,请阅读并了解Rails guides - Association Basics

中的差异

***确保在更改关联时不会丢失数据:

这样做的想法:

  1. 创建联接表
  2. 复制变体表格中的信息(variation.id和相关的product_id)
  3. 开始使用新关联
  4. (您可以复制迁移文件中的数据,只搜索如何操作)