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
- has_many :blah, :dependent => :restrict
- module ActiveRecord
module Associations
module ClassMethods
alias :original_configure_dependency_for_has_many :configure_dependency_for_has_many
alias :original_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 DestroyRestricted.new(record, #{reflection.name.inspect}) unless record.#{reflection.name}.blank? }”
reflection.options[:dependent] = nil
end
end
def configure_dependency_for_has_many(reflection)
verify_restrict reflection
original_configure_dependency_for_has_many reflection
end
def configure_dependency_for_has_one(reflection)
verify_restrict reflection
original_configure_dependency_for_has_one reflection
end
end
end
end
module ActiveRecord
class DestroyRestricted < ActiveRecordError
def initialize(model, by)
super “#{model.class.name} #{model.id} destroy restricted by #{by}”
end
end
end
e faz:
se a conta tiver pedidos é levantada a exceção ActiveRecord::DestroyRestricted
=)
|
|
|
Ronaldo
388 posts
|
Very, very nice. Já submeteu como um patch? Seria interessante fazer uns unit tests e submeter.
|
|
|
Davis Zanett...
129 posts
|
Muito bom mesmo!
Rodou redondo aqui! :-)
Já deixei na versão de produção!
|
|
|
Ronie Uliana
891 posts
|
Daniel, faz um gem ou um plugin pra isso! Muito, muito útil!
|
|
|
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.
|
|
|
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…..
|
|
|
Marcelo Júnior
803 posts
|
Quando tu arrumar, mostra ai pra gente.
Vlw
|
|
|
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
|
|
|
Marcelo Júnior
803 posts
|
Soh para constar. Sua versão funcionou aqui shneiderfku, obrigado!
|
|
|
Celestino Gomes
7 posts
|
Não usei, mas muito maneiro!
Parabéns!
Abraços!
|
|
|
Daniel Gatis
166 posts
|
bem que podia rolar um pluginzinho disso ai =)
|
|
|
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!
|
|
|
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
|
|
|
Davis Zanett...
129 posts
|
Estou usando o plugin no windows e no linux sem problemas.
Qual foi seu problema Joe??
|
|
|
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
|
|
|
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!
|
|
|
Davis Zanett...
129 posts
|
A propósito, se deseja adicionar o source do github o endereço correto é:
http://gems.github.com
Abraço!
|
|
|
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
|
|
|
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 !!
|
|
|
Fernando Luizão
1356 posts
|
Cola o stack trace. O plugin deve ser incompatível com a 2.2.2
|
|
|
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’
|
|
|
Fernando Luizão
1356 posts
|
Como está o seu model?
|
|
|
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
|
|
|
Fernando Luizão
1356 posts
|
O relacionamento “announcers_sub_categories” está funcionando?
|
|
|
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 …
|