Связанный контент в Rails.Пользователь выбирает контент для связи.Как сделать?Имеет много?Принадлежит? - PullRequest
0 голосов
/ 24 мая 2018

Приложение имеет сообщения, продукты и услуги.Я хочу, чтобы пользователь выбирал конкретный контент для связи.Пример:

У меня есть 2 услуги.И я добавляю новый ПРОДУКТ.В этом продукте я хочу связать эти 2 услуги и 1 другой продукт.

Первое, что я подумал, это создать поле в базе данных, например related_content, во всех ресурсах и сохранить идентификаторы с запятой, например: service_25, service_302, product_408.Я делал это в другой раз, и ... работает.

Я сохраняю префикс service_ и product_, потому что один и тот же элемент может быть связан с продуктами и услугами.

Но я думаю,это не правильный путь.Возможно, правильный путь - использовать ассоциацию многих ко многим.Но я не знаю, как это сделать.

МОДЕЛИ

product.rb

class Product < ActiveRecord::Base
    has_many :menu_assigns, as: :menu_item, dependent: :destroy

    has_many :categorizings, as: :item, dependent: :destroy
    has_many :categories, -> { where for: Category.fors[:for_products] }, through: :categorizings

    has_one :attach, as: :attached, dependent: :destroy
    has_one :attachment, through: :attach
end

service.rb

class Service < ActiveRecord::Base
    has_many :menu_assigns, as: :menu_item, dependent: :destroy

    has_many :categorizings, as: :item, dependent: :destroy
    has_many :categories, -> { where for: Category.fors[:for_services] }, through: :categorizings

    has_one :attach, as: :attached, dependent: :destroy
    has_one :attachment, through: :attach
end

post.rb

class Post < ActiveRecord::Base
    has_many :menu_assigns, as: :menu_item, dependent: :destroy

    has_many :categorizings, as: :item, dependent: :destroy
    has_many :categories, -> { where for: Category.fors[:for_posts] }, through: :categorizings

    has_one :attach, as: :attached, dependent: :destroy
    has_one :attachment, through: :attach
end

Этот код уже имеет некоторые ассоциации:

Меню: Использование menu_assignsпользователь может добавить в меню сообщение, продукт и услугу.

Категория: Ресурсы имеют категории.Используя категоризацию, контент связан.

Вложение: Является избранным изображением.Используя attach, мы связываем изображение.

Но как связать друг друга, используя ассоциации?

Я представляю что-то вроде этого: @page.related_content и возвращает объект с регистрами.

Моя идея

1) Создайте модель с именем related_groups в следующих полях:

rails g model RelatedGroup item_id:integer item_type:string order:integer

Идентификатор элемента - это идентификатор соответствующего содержимого.Тип товара - модель (Товар, Услуга, Почта).Поле заказа - это заказ, который нужно показать.

2) В этой модели создайте отношение:

class RelatedGroup < ActiveRecord::Base
    belongs_to :item, polymorphic: true
end

3) Создайте отношение в ресурсах (Продукт, Услуга, Почта).Ниже приведен пример публикации:

class Post < ActiveRecord::Base
    has_many :related_groups
end

4) Объедините результаты во всех моделях (Продукт, Сервис, Почта).Ниже приведен пример публикации:

class Post < ActiveRecord::Base
    has_many :related_groups
    with_options through: :related_groups, source: :item do
        has_many :posts, source_type: 'Post'
        has_many :products, source_type: 'Product'
        has_many :services, source_type: 'Service'
    end
end

Это кажется правильным, но я не уверен.

А контроллеры?А мнения?В Post (пример), как создать флажки для проверки соответствующего содержимого?А в контроллере как сохранить данные?А как установить порядок?

Я пользуюсь rails 4.2

Я ценю любую помощь.Tks!

1 Ответ

0 голосов
/ 25 мая 2018

Проверьте связь has_and_belongs_to_many:

https://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_and_belongs_to_many

В зависимости от ваших требований вы можете либо иметь одну таблицу соединений для каждого вида связанных объектов (сообщение / продукт / услуга), либо иметьобъединенная таблица соединений с дополнительным атрибутом для определения типа объекта, с которым вы ассоциируетесь, например,

class CreatePostRelationJoinTable < ActiveRecord::Migration
  def change
    create_table :post_relations, id: false do |t|
      t.integer :post_id
      t.string  :relation_type
      t.integer :relation_id
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...