У пользователя есть много настроек конфиденциальности

StackOverflow https://stackoverflow.com/questions/4204396

  •  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])
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top