Как я могу создать самореферентную ассоциацию таблицы рельсов миграции - PullRequest
1 голос
/ 16 июня 2019

Скажем, у меня есть таблица products и я хочу сохранить similar_products для каждого продукта.

Ответы [ 3 ]

1 голос
/ 16 июня 2019
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, если вы собираетесь использовать только одно.

1 голос
/ 15 июля 2019

Вы можете попробовать следующие способы:

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
1 голос
/ 16 июня 2019

Это миграция для самоссылочной таблицы.

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
...