У пользователя есть много настроек конфиденциальности
-
25-09-2019 - |
Вопрос
У меня есть настройки конфиденциальности для пользователей. Настройки конфиденциальности могут быть такими:
- Не показывать мои обновления на общественном графике
- Не показывать мой адрес электронной почты
- Не показывать мою дату рождения
Я думал о настройках конфиденциальности встроена в коллекцию пользователя.
class User
include Mongoid::Document
include Mongoid::Timestamps
embeds_many :privacies
...
end
class Privacy
include Mongoid::Document
field :title, :type => String
field :description, :type => String
field :is_active, :type => Boolean
embedded_in :user, :inverse_of => :privacies
...
end
Моя форма выглядит как:
<%= form_for(@user, :url => user_path(@user)) do |f| %>
<ul>
...
<% @user.notifications.each do |notification| %>
<li>
<%= check_box_tag 'user[notifications][]', notification.id, notification.is_active %>
<%= label_tag notification.description %>
</li>
<% end %>
<li class="clearfix">
<%= image_submit_tag('update.png', :class => 'submit') %>
</li>
</ul>
<% end %>
Когда форма представляет. Он имеет следующие слова:
{"utf8"=>"✓", "_method"=>"put",
"authenticity_token"=>"FQvGlJ8p+SPX8MIQqMjS04tHVLQ4jEl31tpAoKwGYDE=", "user"=>{"city_id"=>"",
"notifications"=>["4ce3c66872357e0a95000011", "4ce3c66872357e0a95000012"]}, "action"=>"update",
"controller"=>"users", "id"=>"1234"}
Как вы можете видеть сверху. Его представление идентификаторов уведомлений в качестве массива: «Уведомления» => ["4Ce3C66872357E0A95000011", "4Ce3C66872357E0A95000012"]}
У моих пользователей контроллер, обновить метод. У меня есть:
def update
@user = User.where(:id => params[:id]).first
# Unset all notifications for user
@user.notifications.each do |notification|
notification.update_attributes!(:is_active => false)
end
# Based on the form, set notifications
params[:user][:notifications].each do |notification|
@user.notifications.find(notification).update_attributes!(:is_active => true)
# @user.notifications.first.update_attributes!(:is_active => false)
end
# Remove the notifications from params
params[:user][:notifications] = []
respond_to do |format|
if @user.update_attributes(params[:user])
...
end
end
Мой метод обновления выглядит немного грязно, потому что:
1) Я сбрасываю все флажки, установленные: iS_ Active для false.
2) После того, как я просматриваю параметры для всех идентификаторов уведомлений и устанавливая каждого: IS__активно для true.
3) Наконец, я удаляю массив уведомлений с параметров, в противном случае мою форму не сохраняет должным образом.
Есть ли лучший / более чистый способ получить это работать с монгоидом? Или возможно, есть ли лучший подход к проектированию этого? Я думал о том, чтобы использовать много к многим, а не встроенным.
о чем ты думаешь?
После,
Решение
Выглядит хорошо. Вы могли бы очистить его немного, но это не сделает много раз разных.
Т.е.
# loop and set these to false
user.notifications.not_in(:id => params[:user][:notifications])
# loop and set these to true
user.notifications.any_in(:id => params[:user][:notifications])