Лучший способ разрешить пользователям указывать, какие атрибуты доступны для публики?

В одной из моих таблиц (продавцов) все поля требуют разрешения от пользователя для других (зарегистрированных или незарегистрированных). Я мог бы пройти и создать соответствующий столбец для каждого столбца, например. (column1, column1_privacy, column2, 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

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

1
добавлено
pro.ruby
pro.ruby
1 181 участник(ов)

Язык программирования Ruby Additional docs: https://rubyreferences.github.io/rubyref/ Invite: https://telegram.me/joinchat/Be4rsT2NuB3CyJaF26j1kA Кто хочет компилировать: @crystal_ru (его синтаксис основан на Ruby) Участник @proDOT

Ruby, Rails, Hanami | dry-rb
Ruby, Rails, Hanami | dry-rb
1 180 участник(ов)

https://telegram.me/rubyjob - Ruby Job По вопросам - @eugene_shved

Ruby School .us
Ruby School .us
1 045 участник(ов)

Чат-болталка для учеников руби-школы и не только. Правила: https://telegra.ph/Pravila-chata-Rubi-shkoly-03-13

Random Ruby Chat
Random Ruby Chat
589 участник(ов)

Правила публикации вакансий: https://t.me/codenamecrud/60865

dbGeeks
dbGeeks
545 участник(ов)

Чат про базы данных, их устройство и приемы работы с ними. Разрешаются любые адеватные дискуссии в рамках тематики чата.

Rubyata
Rubyata
333 участник(ов)

Коммюнити Ruby и Ruby On Rails Флуд не приветствуются. Вакансии можно публиковать только и ТОЛЬКО по пятницам с хештегом #вакансия.

Ruby Talks
Ruby Talks
236 участник(ов)

Национальная Флеймотека

RubyRush
RubyRush
189 участник(ов)

rubyrush.ru программирование для самых новичков

Разработка СУБД
Разработка СУБД
143 участник(ов)

Rails Chat
Rails Chat
87 участник(ов)

You are welcome to discuss Ruby On Rails development process and other stuff