Приложение имеет сообщения, продукты и услуги.Я хочу, чтобы пользователь выбирал конкретный контент для связи.Пример:
У меня есть 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!