【问题标题】:How do I create a self-referential association table rails migration如何创建自引用关联表 rails 迁移
【发布时间】:2019-06-16 10:09:22
【问题描述】:

假设我有一张桌子products 并想为每个产品维护similar_products。

【问题讨论】:

    标签: ruby-on-rails rails-activerecord rails-migrations


    【解决方案1】:

    这是自引用表的迁移。

    create_table :similar_products, id: false do |t|
          t.references :product, foreign_key: true, null: false
          t.references :similar_product, foreign_key: { to_table: :similar_products }
        end
    

    【讨论】:

      【解决方案2】:
      class SimilarProductRelation < ApplicationRecord
        belongs_to :product
        belongs_to :similar_product, class_name: "Product"
      end
      
      class Product < ApplicationRecord
        # self being the "origin"
        has_many :similar_products_relations, source: :product_id, class_name: "SimilarProductRelation"
        has_many :similar_products, class_name: "Product", through: :similar_products_relations
      
        # self being the "destination"
        has_many :similar_products_relations_as, source: :similar_product_id, class_name: "SimilarProductRelation"
        has_many :similar_products_as, class_name: "Product", through: :similar_products_relations
      end
      
      # migration
      create_table :similar_product_relations do |t|
        t.references :product, foreign_key: true, null: false, index: true
        t.references :similar_product, foreign_key: { to_table: :products }, null: false, index: true 
      end
      

      索引是否为真取决于您要查询的方向,并且您只能在关联中保留一个方向,在 Product 类中,如果您只打算使用一个。

      【讨论】:

        【解决方案3】:

        您可以尝试以下方法:

        class Product < ActiveRecord::Base
           belongs_to :product, :class_name => 'Product'
           has_many :similar_products, :class_name => 'Product', :foreign_key => 'parent_id'
        end
        

        迁移可以添加为:

        add_column :products, :parent_id, :integer, null: true, index: true
        add_foreign_key :products, :products, column: :parent_id
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-24
          • 2018-01-31
          • 2023-03-31
          • 1970-01-01
          • 2016-12-07
          • 1970-01-01
          • 2014-01-28
          • 2019-04-16
          相关资源
          最近更新 更多