Rails: как связать модель с несколькими родителями - PullRequest
0 голосов
/ 02 февраля 2020

В моем приложении есть модель Note, которой я хотел бы поделиться с несколькими другими моделями. Что-то вроде:

rails g model Note ...
rails g model ModelA ... note:references
rails g model ModelB ... note:references
rails g model ModelC ... note:references

Пока все хорошо, но я думаю, что я хотел бы найти способ - из примечания - найти «родительскую» модель. Обратите внимание, что модели - это разные «вещи», поэтому я не думаю, что смогу сделать это в модели Note:

belongs_to :model_symbol_here

Поскольку примечание может принадлежать одной из нескольких разных моделей.

Концептуально кажется, что я мог бы сделать что-то вроде:

rails g model Note parent_id:integer parent_type:string ...

Я думаю, что это сработало бы, но я думаю, что это было бы за счет потери способности использовать понимание Rails отношений между моделями.

Похоже, что это та проблема, которая возникала достаточно часто, чтобы было название для нее, а также "стандартное" решение. Есть ли подходящий способ Rails для этого?

1 Ответ

2 голосов
/ 02 февраля 2020

Генерация модели отца

rails g model brand name:string

Семена модели отца

Brand.create name: 'Apple'
Brand.create name: 'Samsung'

Генерация 2 модели ребенка

rails g model phone name:string brand:references
rails g model home_appliance name:string brand:references

Семена детей

apple = Brand.first
Phone.create name: 'Iphone X', brand: apple
Phone.create name: 'Iphone 11', brand: apple
HomeAppliance.create name: 'Apple TV', brand: apple
HomeAppliance.create name: 'Homepod', brand: apple

samsung = Brand.last
Phone.create name: 'Galaxy A30', brand: samsung
Phone.create name: 'Galaxy Tab s6', brand: samsung
HomeAppliance.create name: 'Washing machine', brand: samsung
HomeAppliance.create name: 'Refrigerator', brand: samsung

В приложении / models / brand.rb

  has_many :phones
  has_many :home_appliances

Отец нашел сына

apple.home_appliances
apple.phones

Сын нашел отца

phone = Phone.last
phone.brand

Добавить пример полиморфности c

Добавление продавца, который может продавать телефон и устройство HomeAppliance

rails g model salesman name:string

Отношение между продавцом и продуктом (телефон HomeAppliance) - это MM, поэтому для этого нам нужно создать третью таблицу

rails g model product_sold salesman:references product_id:integer product_type:string

В приложении / models / product_sold.rb добавьте

belongs_to :product, polymorphic: true

Итак

will = Salesman.create name: 'Will'
will_first_sale = ProductSold.create salesman: will, product: Phone.first
will_second_sale = ProductSold.create salesman: will, product: HomeAppliance.last

Чтобы увидеть все, что будет продано добавьте в app / models / salesman.rb

  has_many :product_sold

Теперь вы не можете запустить это

products = will.product_sold.map(&:product) 

В продуктах у вас есть модель Phone и HomeAppliance

Здесь вы нашли еще один полиморф c примеры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...