Como deletar, atualizar e editar uma tabela NxN no Rails

1,497 views
Skip to first unread message

Diogo Machado

unread,
Jan 23, 2014, 6:08:30 AM1/23/14
to rail...@googlegroups.com
Bom dia pessoal, sou novo no Rails e estou com uma dúvida. Eu tenho uma tabela grupos_usuarios, com grupo_id e usuario_id. Como eu faço para excluir essa linha no banco de dados?

Ronaldo Possan

unread,
Jan 23, 2014, 6:16:20 AM1/23/14
to rail...@googlegroups.com
Você quer excluir em cascata?
Se for, na associação do model de grupos_usuarios você deve colocar :dependent => destroy


Em 23 de janeiro de 2014 09:08, Diogo Machado <di...@diogomachado.com> escreveu:
Bom dia pessoal, sou novo no Rails e estou com uma dúvida. Eu tenho uma tabela grupos_usuarios, com grupo_id e usuario_id. Como eu faço para excluir essa linha no banco de dados?

--
--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para
rails-br+u...@googlegroups.com
Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "rails-br" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para rails-br+u...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.



--
Ronaldo Possan
Software Engineer
Expertise in Web Development
+55 19 8820-7159
 ronaldo.possan

Diogo Machado

unread,
Jan 23, 2014, 6:36:06 AM1/23/14
to rail...@googlegroups.com
Não não, eu quero deletar apenas uma linha. Exemplo, eu quero deletar o grupo 1 do usuário 1, como eu passo isso, passando via URL e lá no método destroy

Jonathan Calixto

unread,
Jan 23, 2014, 7:27:04 AM1/23/14
to Grupos Rails BR
Bom dia @Diogo,

dê uma olhada no meu gist e veja se entende: 


Acredito que seja isso. Qualquer coisa dê uma olhada na documentação do rails http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_and_belongs_to_many


Atenciosamente,

Jonathan Celestino Calixto
Desenvolvedor Web Ruby on Rails
email:     jonathan...@gmail.com
msn:       jonathan...@gmail.com
github:    https://github.com/jonathanccalixto
skype:    jonathanccalixto
twitter:    jonathanccalixt

Cezinha

unread,
Jan 23, 2014, 7:38:23 AM1/23/14
to rail...@googlegroups.com
Models:
- User
- Groups

Users -> UsersGroups <- Groups

user = User.find ID
user.users_groups.where(group_id: ID_GRUPO).destroy

+- isso

Diogo Machado

unread,
Jan 23, 2014, 9:03:01 AM1/23/14
to rail...@googlegroups.com
Eu fiz assim, lá na controladora eu chamei:

@grupos_usuario = GruposUsuario.where({grupo_id: params[:grupo], usuario_id: params[:usuario] }).first

Testando no console, ele carrega. Agora como eu faço um:

@grupos_usuario.destroy

Ele dá erro.

Jonathan Celestino Calixto

unread,
Jan 23, 2014, 9:11:27 AM1/23/14
to Grupos Rails BR
Diogo o que voc6e quer é remover o um registro grupo de usuário e remover o relacionamento também, ex:

---------------------------------------------------------------------------------------
user_table    user_group_table                              group_table
:id => 1         :user_id => 1, :group_id => 1            :id => 1
                     :user_id => 1, :group_id => 2            :id => 2

user.groups.first.destroy    # ficaria

user_table    user_group_table                              group_table
:id => 1         :user_id => 1, :group_id => 2            :id => 2
---------------------------------------------------------------------------------------

ou você quer :
---------------------------------------------------------------------------------------
user_table    user_group_table                              group_table
:id => 1         :user_id => 1, :group_id => 1            :id => 1
                     :user_id => 1, :group_id => 2            :id => 2

user.groups.destroy(Group.first)  # ficaria

user_table    user_group_table                              group_table
:id => 1         :user_id => 1, :group_id => 2            :id => 1
                                                                               :id => 2
---------------------------------------------------------------------------------------


Atenciosamente,

Jonathan Celestino Calixto
Desenvolvedor Web Ruby on Rails
email:     jonathan...@hite.com.br

msn:       jonathan...@gmail.com
github:    https://github.com/jonathanccalixto
skype:    jonathanccalixto
twitter:    jonathanccalixt

Diogo Machado

unread,
Jan 23, 2014, 10:59:27 AM1/23/14
to rail...@googlegroups.com
Olha só gente, o que eu quero é apagar um registro da tabela grupos_usuarios, um usuário meu pode estar em vários grupos, por isso essa tabela grupos_usuarios tem grupo_id e usuario_id. Como essa tabela não tem uma ID única, eu não sei como deletar um registro dela.

Na view, eu mando um DELETE passando grupo_id e usuario_id
/grupos_usuarios/1/1

Lá na classe, eu faço
@grupos_usuario = GruposUsuario.where({grupo_id: params[:grupo], usuario_id: params[:usuario] }).first

Só que na hora que mando destruir, ele não vai
@grupos_usuario.destroy

Desculpem a noobissse, sou novo no rails :D

Jonathan Celestino Calixto

unread,
Jan 23, 2014, 11:05:03 AM1/23/14
to Grupos Rails BR
Diogo,

pelo que eu entendi você quer remover a ligação de usuário com grupo, a melhor foram de fazer isso é o primeiro exemplo que eu te informei. https://gist.github.com/jonathanccalixto/8577706. No rails existe um recurso chamado has_and_belongs_to_many (habtm) que te facilita neste caso. Se você está no modelo usuário você só precisa informar os ids dos grupos que quer vincular/manter os outros ele exclui automaticamente, o mesmo caso se estiver no modelo de grupo, você informa os ids dos usuários que quer vincular/manter, os outros ele remove da tabela vinculo.


Atenciosamente,

Jonathan Celestino Calixto
Desenvolvedor Web Ruby on Rails
email:     jonathan...@hite.com.br
msn:       jonathan...@gmail.com
github:    https://github.com/jonathanccalixto
skype:    jonathanccalixto
twitter:    jonathanccalixt

Diogo Machado

unread,
Jan 23, 2014, 12:02:45 PM1/23/14
to rail...@googlegroups.com
Obrigado Jonathan e a todos que responderam, consegui resolver. 

Eu fiz assim, quando eu mando para o método destroy:

# Recebe a ID do usuário
u = Usuario.find(params[:usuario]);

# Deleta o vinculo do usuário na tabela grupos_usuarios
u.grupos.delete(params[:grupo])

-------

Esses dois parametros eu passo via uma rota:
match "grupos_usuarios/:grupo/:usuario/destroy" => "grupos_usuarios#destroy", :via => :delete


-------

Então, os meus links de deletar, ficam assim:
<td><%= link_to 'Deletar', "/grupos_usuarios/#{grupos_usuario.grupo_id}/#{grupos_usuario.usuario_id}/destroy", method: :delete, data: { confirm: 'Tem certeza que deseja excluir esse vinculo?' } %></td>


Obrigado novamente. Agora vou concluir minha aplicação :D

Cezinha

unread,
Jan 23, 2014, 12:46:23 PM1/23/14
to rail...@googlegroups.com
Só uma observação, não use routes desse modo que vc fez : /grupos_usuarios/#{grupos_usuario.grupo_id}/#{grupos_usuario.usuario_id}/destroy", além de ficar feio, é fragil, se você mudar o nome do controller enquanto está desenvolvendo terá que mudar isso, vai quebrar os links; de uma olhada sobre roteamento, ou veja o RAKE ROUTES e veja que ele deve ter criado uma rota similar a isso : user_users_groups_path :)

Diogo Machado

unread,
Jan 23, 2014, 1:35:41 PM1/23/14
to rail...@googlegroups.com
Valeu Cezinha. Eu fiz o seguinte, para essas rotas que eu criei, eu dei um nome (grupos_usuario_delete), ai rodou como você disse (grupos_usuario_delete_path).
Reply all
Reply to author
Forward
0 new messages