Пользователь с инструкциями имеет множество настроек конфиденциальности

У меня есть настройки конфиденциальности для пользователей. Настройки конфиденциальности могут быть такими:

  • Не показывать мои обновления в общедоступной хронике
  • Не показывать мой адрес электронной почты
  • Не показывать дату моего рождения

Я подумал о том, чтобы встроить параметры конфиденциальности в коллекцию User.

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"}

Как вы можете видеть сверху. Он отправляет идентификаторы уведомлений в виде массива: "notifications"=>["4ce3c66872357e0a95000011", "4ce3c66872357e0a95000012"]}

В моем контроллере Users метод обновления. У меня есть:

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_active значение true.

3) Наконец, я удаляю массив уведомлений из параметров, иначе моя форма не сохраняется должным образом.

Есть ли лучший/чистый способ заставить это работать с Mongoid? Или, возможно, есть лучший подход к разработке этого? Я думал об использовании многие ко многим вместо встроенных.

Что ты думаешь?

После,


person Christian Fazzini    schedule 17.11.2010    source источник
comment
Кстати, реализация выше работает. Я просто смотрю, правильно ли я сделал это или есть ли более чистый подход   -  person Christian Fazzini    schedule 17.11.2010


Ответы (1)


Выглядит хорошо. Можно немного почистить, но особой разницы не будет.

I.e.

# 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])
person Dave Rapin    schedule 22.11.2010