Пользователи и вложенные (но потенциально независимые) «группы» в Rails 3?

#ruby-on-rails #grouping #nested-resources

#ruby-on-rails #группировка #вложенные ресурсы

Вопрос:

У меня возникли небольшие проблемы с тем, чтобы кое-что обдумать. По сути, я начинаю новый проект, который включает в себя группы групп групп групп … ну, вы поняли идею.

В любом случае, единственная модель, которая в некоторой степени «универсальна» во всем приложении, — это концепция пользователей (поскольку именно они определяют, какими привилегиями обладает любой человек).). Проблема возникает, когда у вас есть группы, которые могут «владеть» другими группами. Например, у вас может быть раздел «город», который принадлежит разделу «штат», который принадлежит «национальному» разделу и т.д. И у каждой главы могут быть свои собственные пользователи, когда у них будут права на все группы ниже них.

Однако дело в том, что ни одна группа не гарантированно принадлежит (или используется) другой группе, поэтому ими нужно будет управлять независимо. Я не могу вполне концептуализировать, какой была бы методология для обработки чего-либо подобного. Я имею в виду, что я, вероятно, мог бы использовать какую-то настройку acts_as_nested, но я боюсь, что даже это может выйти из-под контроля. Кроме того, что касается самих групп, должен ли я использовать какую-то модель наследования (учитывая, что они, вероятно, будут иметь много общих свойств)?

Возможно, мне следует просто создать индивидуальную настройку MVC для каждой группы — хотя все еще остается проблема с ассоциированием пользователей и т.д. Кто-нибудь может предложить предложения?

Лучшие

Ответ №1:

Вы могли бы создать таблицу групп, которая ссылается на себя. Это позволило бы сохранить все данные вашей группы в одной таблице, а волшебство осуществляется с помощью ассоциаций.

У Райана Бейтса есть railscast, который, вероятно, можно было бы настроить в соответствии с вашей ситуацией. например, вместо дружбы, владения или чего-то подобного.

Редактировать: помогает наличие только одного родителя. Похоже, что плагин acts_as_tree, скорее всего, будет работать для выполнения поставленной задачи. У Райана Бейтса, оказывается, также есть эпидсод railscasts для этого плагина.

Цели

1. Разрешить группам иметь дочерних элементов, родителей Решение: acts_as_tree

2. Разрешить группам потенциально становиться или оставаться независимыми. Решение: acts_as_tree. Просто удалите parent_id, и группа станет собственным корневым узлом

3. Принудительное использование иерархии (например, города не могут иметь другой город в качестве родительского). Решение: это, вероятно, должно быть сделано с помощью пользовательской проверки

4. Наследование прав пользователей. Я ожидал, что эта конкретная цель будет самой сложной. Конечно, я не знаю всех входов и выходов из того, что «права» означают для вашего приложения, но я сделаю некоторые предположения… вы заполняете пробелы, где я ошибаюсь. Как только у вас будут ассоциации между пользователями и группами (и возможной таблицей «прав»). Решение: Чтобы определить, должны ли права применяться к current_user для current_group, а) проверьте право собственности и, если нет, б) запустите current_group.ancestors, пока не получите ответ или не попадете в root.

Это звучит как забавный проект. Я желаю вам удачи с этим!

Комментарии:

1. Да, я рассматривал это. Сейчас меня беспокоит только то, что конкретная группа когда-либо отличается (отсюда и «потенциально независимая» в названии) от исходной структуры «ГРУППЫ». Я в некотором роде помешан на нормализации и часто упреждающе (и напрасно) беспокоюсь о такого рода вещах. Я полагаю, мы могли бы просто сделать группы достаточно универсальными и пересечь этот мост, когда доберемся туда. Еще одна вещь заключается в том, что групповое владение должно быть линейным (например, Страна владеет штатом, владеющим городом), поэтому мне нужно было бы как-то встроить это. Введите столбец с бизнес-правилами в групповой модели?

2. Сколько типов групп у вас могло бы быть? Кроме того, сколько владельцев или родителей может быть у конкретной группы?

3. В настоящее время существует 3 типа групп: городская глава, государственная глава и национальная глава. Но в будущем мы могли бы вставить новые группы выше (например, международные), ниже (например, Район) или между (например, Округ). Мне просто нужна качественная модель, которая будет поддерживать возможность связывания с ними владельца и пользователей (логинов). Все права собственности будут линейными. Таким образом, в стране может быть много штатов, а в штате может быть много городов. По сути, 1 ко многим на всем пути вниз.