Pergunta

Tenho configurações de privacidade para os usuários definirem. As configurações de privacidade podem ser como tais:

  • Não mostre minhas atualizações sobre a linha do tempo pública
  • Não mostre meu endereço de e -mail
  • Não mostre minha data de nascimento

Pensei em ter configurações de privacidade incorporadas na coleção de usuários.

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

Meu formulário parece:

<%= 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 %>

Quando o formulário envia. Tem os seguintes parâmetros:

{"utf8"=>"✓", "_method"=>"put", 
"authenticity_token"=>"FQvGlJ8p+SPX8MIQqMjS04tHVLQ4jEl31tpAoKwGYDE=", "user"=>{"city_id"=>"", 
"notifications"=>["4ce3c66872357e0a95000011", "4ce3c66872357e0a95000012"]}, "action"=>"update", 
"controller"=>"users", "id"=>"1234"}

Como você pode ver de cima. Está enviando os IDs de notificação como uma matriz: "Notificações" => ["4CE3C66872357E0A95000011", "4CE3C66872357E0A95000012"]}

No meu controlador de usuários, o método de atualização. Eu tenho:

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

Meu método de atualização parece um pouco confuso, porque:

1) Estou redefinindo todas as caixas de seleção por configuração: is_active para false.

2) Depois, estou analisando os parâmetros para todos os IDs de notificação e definindo cada um: is_active como true.

3) Finalmente, removo a matriz de notificações dos parâmetros, caso contrário, meu formulário não salva corretamente.

Existe uma maneira melhor / mais limpa de fazer isso funcionar com o Mongoid? Ou talvez, exista uma abordagem melhor para projetar isso? Eu estava pensando em usar muitos para muitos em vez de incorporado.

Quais são seus pensamentos?

Depois,

Foi útil?

Solução

Parece bem. Você pode limpá -lo um pouco, mas não fará muita diferença.

Ou seja

# 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])
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top