Найкращий спосіб дозволити користувачам вказати, які атрибути доступні для громадськості?

У одному з моїх таблиць (продавців) для всіх полів потрібен дозвіл від користувача для перегляду інших (зареєстрованих або не зареєстрованих). Я міг би пройти і створити відповідний стовпець для кожного стовпця, ex. (колонка1, колонка1_привілей, колонка2, column2_privacy). Однак це здається зайвим і поганим дизайном.

Чи є більш елегантне рішення для цього в Rails? Заздалегідь спасибі.

1
один варіант - серіалізувати все в одному стовпчику, але це не те краща ідея.
додано Автор apneadiving, джерело

2 Відповіді

You could create a associated model named 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]

Вид

<% Seller.column_names.each do |column_name| %>
     <% unless @blacklisted_columns.include?(column_name) %>
          #Generate your checkboxes and labels here
     <% end %>
<% end %>
1
додано

Я б не назвав це зайвим або поганим дизайном. Якщо ви хочете контролювати доступ до кожного стовпця, то десь, де вам знадобиться один прапор на кожен стовпець; ви можете упакувати всі ці прапори в одну серійну структуру, але тоді ви будете боротися проти вашої реляційної бази даних:

  • Що відбувається з вашими серійними списками 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
додано
IT KPI - Databases
IT KPI - Databases
162 учасників