Я бы не назвал это избыточным или плохим дизайном. Если вам нужен контроль доступа по столбцам, то где-то вам понадобится один флаг на столбец; вы можете упаковать все эти флаги в одну сериализованную структуру, но тогда вы будете бороться против своей реляционной базы данных:
- Что происходит с вашими сериализованными списками ACL при добавлении или удалении столбца? Вы регенерируете их всех или просто накапливаете грязь?
- Что произойдет, если вам нужно включить флаги в запрос? Вам будет сложно распаковать упакованный флаг-блоб в SQL, а распаковка в Ruby может быть очень дорогой.
Вы можете использовать отдельную таблицу в стиле EAV, которая содержит имена столбцов, но вам все равно придется очищать ее при добавлении и удалении столбцов. И запросы с таблицей EAV имеют тенденцию довольно быстро превращаться в ужасный беспорядок.
Один флаг-столбец для каждого столбца, контролируемого доступом, прост в настройке, прост в запросе, прост в редактировании, в автоматическом построении форм и позволяет легко избежать беспорядка в базе данных. Дополнительные столбцы могут сделать ваши таблицы немного широкими, но я бы об этом не беспокоился.
Дополнительные столбцы позволяют легко извлечь отображаемую информацию из вашей модели:
def viewable_parts
%w{column1 column2 column3}.each_with_object({}) do |col, h|
h[col] = self.send(col) if(self.send(col + '_privacy')
end
end
Тогда вы можете сказать такие вещи в вашем контроллере:
@display_info = model.viewable_parts
и вашим представлениям не нужно слишком беспокоиться об управлении доступом, они могут просто показать, что находится в хэше. Этот трюк, конечно, можно использовать с другими реализациями, но он очень прост, если вы используете свою идею «столбца конфиденциальности».