Как правильно связать объекты в рельсах без создания отдельных таблиц для корреляций - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь выяснить, как уменьшить количество таблиц / объектов в моем приложении rails.Вот пример нескольких объектов и их отношений.На данный момент нет данных, поэтому я могу редактировать эти отношения по мере необходимости.Для этого примера есть 3 объекта: Пользователи, группы и Правила

Пользователи
Отношения
assign_to_and_has_many Группы
Proper_to_and_has_many Правила

Группы
Отношения
# Используются подгруппы
принадлежат_то_and_has_many Группы
принадлежат_то_and_has_many Пользователи
Proper_to_and_has_many Правила

Правила
Отношения
# Используется для правил sub_rules
принадлежат_то_и_манимам
принадлежат_то_и_мани группам
принадлежат_то_и_мани пользователям


Требования:

я не знаюне нужно иметь таблицы для каждого из отношений.

Пользователь может не иметь каких-либо групп или правил или может иметь разные правила в зависимости от группы.

Группа может не иметь никаких правилили может иметь несколько правил.

Правило может быть частью только группы, пользователя или обоих.


Вопросы:

Как мнехранить несколько групп в правилеобъект, в поле групп?

Я не хочу иметь отдельную реляционную таблицу для каждого отношения, потому что в нашей системе 30 таблиц с множеством этих различных сценариев отношений.Должен быть способ хранить отношения в массиве, которого я никогда раньше не делал, и исторически всегда создавал отдельные таблицы / объекты для таких отношений.

Я создаю и сохраняю отношения какмассив?

Знает ли Rails, как добавить / удалить оттуда, или это будет больше в GUI для удаления / редактирования и просто сохранения нового массива объектов при сохранении?

1 Ответ

0 голосов
/ 04 июня 2018

Да, я тоже не хотел создавать целую кучу таблиц "многие ко многим".Итак, вот как я это делаю (примерно).

Я создал класс с именем 'HasA', который выглядит примерно так:

# == Schema Information
#
# Table name: has_as
#
#  id              :integer          not null, primary key
#  haser_type      :string           not null
#  haser_id        :integer          not null
#  hased_type:     :string           not null
#  hased_id:       :integer          not null
#  created_at      :datetime         not null
#  updated_at      :datetime         not null
#
class HasA < ActiveRecord::Base
  validates :haser_type, :haser_id, :hased_type, :hased_id, presence: true
  belongs_to :hased, polymorphic: true
  belongs_to :haser, polymorphic: true
end

Затем я создал модуль (фактически, коллекциюмодули), которые позволяют мне делать что-то вроде:

class User < ActiveRecord::Base
  acts_as_having :groups, :rules
end

И

class Rule < ActiveRecord::Base
  acts_as_had_by :groups, :users
end

Так что я могу делать такие вещи, как:

@user.groups            
@user.groups << @group  
@user.groups.destroy(@group)
@user.group_ids
@user.groups.where(id: 4)
@user.groups.new(id: 5, name: 'foo')

И так далее (по существуРепликация многих стандартных методов, предоставляемых has_many).

Я также могу сделать:

@rule.groups
@rule.users

Теперь я могу связывать любые модели, которые мне нужны, без необходимости иметь уникальные таблицы связей.Есть только одна таблица HasA, которая связывает все.И я могу делать все виды операций над связанными записями без необходимости писать какой-либо дополнительный код.Что, я думаю, то, что вы ищете.

Естественно, я собрал все это как драгоценный камень, чтобы я мог включить его во все свои проекты.Потому что, кто хочет кодировать что-то более одного раза?

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