JavaFree.org | RubyOnBr.org

:dependent => :restrict

Acompanhar :dependent => :restrict 30 posts, 10 participantes

Páginas: 1 2

Avatar Daniel Gatis 166 posts

Acho que muita gente já se perguntou porque não tem um :dependent => :restrict para os relacionamentos ;D

Uma Conta tem muitos Pedidos … O que fazer quando a conta é apagada
eis a solução:

mas se no caso você não quizer deixar apagar as contas com pedidos?!

Cola isso no teu environment.rb

e faz:

se a conta tiver pedidos é levantada a exceção ActiveRecord::DestroyRestricted

=)

 
Avatar Ronaldo 388 posts

Very, very nice. Já submeteu como um patch? Seria interessante fazer uns unit tests e submeter.

 
Avatar Davis Zanett... 129 posts

Muito bom mesmo!
Rodou redondo aqui! :-)

Já deixei na versão de produção!

 
Avatar Ronie Uliana 891 posts

Daniel, faz um gem ou um plugin pra isso! Muito, muito útil!

 
440002948_b8dc8436b4 Marcelo Júnior 803 posts

No Rails 2.0 não está funcionando, aparece a seguinte mensagem:

C:/Marcelo/eas/config/environment.rb:12: undefined method `configure_dependency_for_has_many' for module `ActiveRecord::Associations::ClassMethods' (NameError)

Tentei arrumar, mas como estou sem tempo, larguei ai pra comunidade §:]

Seria interessante arrumar isso, pois é de extrema utilidade.

 
Avatar rrsilva 157 posts

Perfeito! Vou ver se arrumo este bug q o Marcelo citou, pois quero colocar isso no programa aqui da empresa >D

Patch, patch, patch, patch…..

 
440002948_b8dc8436b4 Marcelo Júnior 803 posts

Quando tu arrumar, mostra ai pra gente.

Vlw

 
Avatar rrsilva 157 posts

No meu não deu este erro, deu este:

The :dependent option expects either :destroy, :delete_all, or :nullify (nil)

Então eu fiz estas modifcações para recuperar o ArgumentError

config/initializers/dependent_restrict.rb


module ActiveRecord

class DestroyRestrictedAssociationError < ActiveRecordError
def initialize(model, by)
super(“#{model.class.name} #{model.id} destroy restricted by #{by}”)
end
end

module Associations
module ClassMethods

alias :old_configure_dependency_for_has_many :configure_dependency_for_has_many
alias :old_configure_dependency_for_has_one :configure_dependency_for_has_one

def verify_restrict(reflection)
case reflection.options[:dependent]
when :restrict
module_eval “before_destroy { |record| raise DestroyRestrictedAssociationError.new(record, #{reflection.name.inspect}) unless record.#{reflection.name}.blank? }”
else
raise ArgumentError, “The :dependent option expects either :destroy, :delete_all, :nullify or :restrict (#{reflection.options[:dependent].inspect})”
end
end

def configure_dependency_for_has_many(reflection)
old_configure_dependency_for_has_many(reflection)
rescue ArgumentError
verify_restrict(reflection)
end

def configure_dependency_for_has_one(reflection)
old_configure_dependency_for_has_one(reflection)
rescue ArgumentError
verify_restrict(reflection)
end

end
end

end

ps: *ainda não fiz testes

 
440002948_b8dc8436b4 Marcelo Júnior 803 posts

Soh para constar. Sua versão funcionou aqui shneiderfku, obrigado!

 
Avatar Celestino Gomes 7 posts

Não usei, mas muito maneiro!

Parabéns!

Abraços!

 
Avatar Daniel Gatis 166 posts

bem que podia rolar um pluginzinho disso ai =)

 
Avatar Davis Zanett... 129 posts

Ae galera, como isso me ajudou, transformei em plugin e está disponível em:
http://github.com/daviscabral/destroy_restricted/tree/master

Abraço!

 
Avatar Joe Kaisaka 10 posts

Queria muito testar esse plugin na minha aplicação, mas não consigo instalar esse plugin no meu windows xp sp2.
O que devo fazer ? (trocar o OS não vale) hehehehehe
[]’s

 
Avatar Davis Zanett... 129 posts

Estou usando o plugin no windows e no linux sem problemas.
Qual foi seu problema Joe??

 
Avatar Joe Kaisaka 10 posts

Davis :

Eu preciso incluir o github na lista de sources certo ?
Quando eu digito :

gem source -a http://github.com/

Aparece a seguinte mensagem de erro :

Error fetching http://github.com/
getaddrinfo: no address associated with hostname (SocketError)
getting size of http://github.com/Masrshal.4.8

 
Avatar Davis Zanett... 129 posts

Ola Joe,

Na realidade ele não é um gem, e sim um plugin. Não sei se funciona dessa forma.
Vou ver se transformo ele em gem.

No caso, tu só precisa fazer download e jogar o conteudo dentro de vendor/plugins/destroy_restricted que já poderá fazer uso.

Abraço!

 
Avatar Davis Zanett... 129 posts

A propósito, se deseja adicionar o source do github o endereço correto é:
http://gems.github.com

Abraço!

 
Avatar Joe Kaisaka 10 posts

Davis

Perdão… eu que escrevi errado aqui. o correto realmente é http://gems.github.com.
Com gems, não funciona. Mas baixei o plugin e o instalarei.
Eu gostaria de resolver esse problema dos sources para testar o mydry do urubatan.

Obrigado Davis

 
Avatar Glauber Dourado 5 posts

Davis e Daniel,
Vlw msm, muito útil este plugin.

Uso o rails 2.2.2. E instalei o plugin, porém aqui a exceção ActiveRecord::DestroyRestricted ACHO q num levantou nao, caiu num RuntimeError.

RuntimeError in Announcers_categoriesController#destroy

RAILS_ROOT: /home/glauber/rails/infobase
Application Trace | Framework Trace | Full Trace

(eval):1:in `verify_restrict’
app/controllers/announcers_categories_controller.rb:78:in `destroy’

Request

Parameters:

{"_method"=>"delete",
“authenticity_token”=>"94efbba7214b6f9940881280adb6229731055341",
“id”=>"1"}

+ um Full-trace enorme !!

 
Avatar Fernando Luizão 1356 posts

Cola o stack trace. O plugin deve ser incompatível com a 2.2.2

 
Avatar Glauber Dourado 5 posts

Ta na mão.

RuntimeError:
from (eval):1:in `verify_restrict’
from /usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/ callbacks.rb:182:in `call’
from /usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/ callbacks.rb:182:in `evaluate_method’
from /usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/ callbacks.rb:166:in `call’
from /usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/ callbacks.rb:93:in `run’
from /usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/ callbacks.rb:92:in `each’
from /usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/ callbacks.rb:92:in `send’
from /usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/ callbacks.rb:92:in `run’
from /usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/ callbacks.rb:277:in `run_callbacks’
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/ca llbacks.rb:315:in `callback’
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/ca llbacks.rb:307:in `destroy_without_transactions’
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/tr ansactions.rb:179:in `send’
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/tr ansactions.rb:179:in `with_transaction_returning_status’
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/co nnection_adapters/abstract/database_statements.rb:66:in `transaction’
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/tr ansactions.rb:129:in `transaction’
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/tr ansactions.rb:138:in `transaction’
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/tr ansactions.rb:178:in `with_transaction_returning_status’
from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/tr ansactions.rb:142:in `destroy’

 
Avatar Fernando Luizão 1356 posts

Como está o seu model?

 
Avatar Glauber Dourado 5 posts

class Announcer < ActiveRecord::Base
belongs_to :announcers_category
belongs_to :announcers_sub_category
belongs_to :local
end

class AnnouncersCategory < ActiveRecord::Base
has_many :announcers_sub_categories, :dependent => :restrict
has_many :announcers
end

class AnnouncersSubCategory < ActiveRecord::Base
belongs_to :announcers_category
has_many :announcers
end

O teste:

com categoria e subcategorias associadas no banco.

a = AnnouncersCategory.find(:first)
a.destroy

 
Avatar Fernando Luizão 1356 posts

O relacionamento “announcers_sub_categories” está funcionando?

 
Avatar Glauber Dourado 5 posts

Fernando,

Tá sim.

Os métodos de relacionamentos estao todos funcionando e testados. por exemplo:

Criei no banco uma AnnoncersCategory com nome = “a”.
Criei tb 2 AnnouncersSubCategory com nomes “a1” e “a2”, ambas relacionadas a “a”

daí:

AnnouncersCategory.find(:first)

=> #<AnnouncersCategory id: 1, name: “a”, created_at: “2009-01-16 13:19:39”, updated_at: “2009-01-16 13:19:39”>

AnnouncersCategory.find(:first).announcers_sub_categories

=> [#<AnnouncersSubCategory id: 1, name: “a1”, announcers_category_id: 1, created_at: “2009-01-16 13:19:52”, updated_at: “2009-01-16 13:19:52”>, #<AnnouncersSubCategory id: 2, name: “a2”, announcers_category_id: 1, created_at: “2009-01-16 13:19:57”, updated_at: “2009-01-16 13:19:57”>]

e

Na linha :
has_many :announcers_sub_categories, :dependent => :restrict

Qdo coloco :destroy no lugar de :restrict o delete cascade funfa legal …

Próxima página

Páginas: 1 2