Лучший способ разрешить пользователям указывать, какие атрибуты доступны для общественности? - PullRequest
1 голос
/ 28 октября 2011

В одной из моих таблиц (продавцы) для всех полей требуется разрешение пользователя, чтобы другие пользователи (зарегистрированные или незарегистрированные) могли их видеть. Я мог бы пройти и создать связанный столбец для каждого столбца, напр. (column1, column1_privacy, column2, column2_privacy). Тем не менее, это кажется излишним и плохим дизайном.

Есть ли более элегантное решение для этого в Rails? Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 29 октября 2011

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

  • Что происходит с вашими сериализованными списками 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

и вашим представлениям не нужно слишком беспокоиться об управлении доступом, они могут просто показать, что находится в хэше. Этот трюк, конечно, можно использовать с другими реализациями, но он очень прост, если вы используете свою идею «столбца конфиденциальности».

1 голос
/ 29 октября 2011

Вы можете создать связанную модель с именем SharedColumn

rails g scaffold SharedColumn name:string, seller_id:integer

Продавец:

has_many :shared_columns

SharedColumn

belongs_to :seller

Тогда вы можете использовать метод column_names для итерации списка флажков, подобных этому

Контроллер

@blacklisted_columns = [id, other_non_pubic_column]

View

<% Seller.column_names.each do |column_name| %>
     <% unless @blacklisted_columns.include?(column_name) %>
          #Generate your checkboxes and labels here
     <% end %>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...