just wondering what I would put in: (a) before_destroy - then proactively destroy the other associated object, BUT if those objects had a before_destory this could become circular no? (b) after_destroy - test to see if both ends were destroy, but if one end tests first prior to the other end being destroyed this would be an issue no?
On Thu, Jan 15, 2009 at 4:21 PM, Andrew Timberlake < [email protected]> wrote: > On Thu, Jan 15, 2009 at 8:20 AM, Andrew Timberlake < > [email protected]> wrote: > >> On Thu, Jan 15, 2009 at 7:46 AM, Greg Hauptmann < >> [email protected]> wrote: >> >>> PS. Here's an update where I'm at if anyone whats to comment. Not quite >>> finished however I'm wondering now if I ensure solid validation level checks >>> in model validations (e.g. both ends of an association are working, means >>> have to set both ends manually) that I could then rely on Rails to actually >>> save both ends of an association even if you only save one. (e.g. seems when >>> I save book, chapter also gets saved, and vice-versa). Here's where I'm at: >>> >>> ---------------------------------------------------------- >>> require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') >>> >>> # ----------- BOOK --------------- >>> class Book < ActiveRecord::Base >>> has_many :chapters >>> >>> def validate >>> if self.chapters.length == 0 >>> errors.add_to_base("Book does not have an associated Chapter") >>> end >>> end >>> >>> end >>> >>> # ----------- CHAPTER --------------- >>> class Chapter < ActiveRecord::Base >>> belongs_to :book >>> >>> def validate >>> if !self.book >>> errors.add_to_base("Chapter does not have an associated Book") >>> end >>> end >>> >>> end >>> >>> # --------- RSPEC (BOOK) ------------ >>> describe Book do >>> before(:each) do >>> @valid_attributes = {:amount => 100} >>> @b = Book.new(:amount => 100) >>> @c = Chapter.new(:amount => 100) >>> end >>> >>> it "should save without error when association is in place" do >>> @c.book = @b >>> @b.chapters = [...@c] >>> @b.save! >>> @c.save! >>> end >>> >>> it "should delete without error when both ends of association are >>> deleted" do >>> @c.book = @b >>> @b.chapters = [...@c] >>> @b.save! >>> @c.save! >>> >>> @c.destroy >>> @b.destroy >>> end >>> >>> it "should fail for SAVE! if there is no association (OBJECT LEVEL)" do >>> lambda{ @b.save! }.should raise_error >>> end >>> >>> it "should fail for SAVE! if there is no association (DATABASE LEVEL)" >>> do >>> @c.book = @b >>> @b.chapters = [...@c] >>> lambda{ @b.save! }.should_not raise_error #on basis that Rails will >>> save Chapter automatically >>> end >>> >>> it "should fail for DELETE if one side left open" do >>> @c.book = @b >>> @b.chapters = [...@c] >>> @b.save! >>> @c.save! >>> >>> lambda{ @b.destroy }.should raise_error >>> end >>> >>> end >>> >>> # ----------RSPEC (CHAPTER) -------------------- >>> describe Chapter do >>> before(:each) do >>> @valid_attributes = {:amount => 100} >>> @b = Book.new(:amount => 100) >>> @c = Chapter.new(:amount => 100) >>> end >>> >>> it "should save without error when association is in place" do >>> @c.book = @b >>> @b.chapters = [...@c] >>> @b.save! >>> @c.save! >>> end >>> >>> it "should delete without error when both ends of association are >>> deleted" do >>> @c.book = @b >>> @b.chapters = [...@c] >>> @b.save! >>> @c.save! >>> >>> @c.destroy >>> @b.destroy >>> end >>> >>> it "should fail for SAVE! if there is no association (OBJECT LEVEL)" do >>> lambda{ @c.save! }.should raise_error >>> end >>> >>> it "should fail for SAVE! if there is no association (DATABASE LEVEL)" >>> do >>> @c.book = @b >>> @b.chapters = [...@c] >>> lambda{ @c.save! }.should_not raise_error # on basis that Rails will >>> automatically save Book >>> end >>> >>> it "should fail for DELETE if one side left open" do >>> @c.book = @b >>> @b.chapters = [...@c] >>> @b.save! >>> @c.save! >>> >>> lambda{ @c.destroy }.should raise_error >>> end >>> >>> end >>> ---------------------------------------------------------- >>> >>> $ ./script/autospec >>> loading autotest/rails_rspec >>> /opt/local/bin/ruby >>> /opt/local/lib/ruby/gems/1.8/gems/rspec-1.1.12/bin/spec >>> spec/models/all_in_one_test_spec.rb -O spec/spec.opts >>> F......... >>> >>> 1) >>> 'Chapter should fail for DELETE if one side left open' FAILED >>> expected Exception but nothing was raised >>> ./spec/models/all_in_one_test_spec.rb:114: >>> >>> Finished in 0.280484 seconds >>> >>> 10 examples, 1 failure >>> >>> ---------------------------------------------------------- >>> >>> >> Greg, put in a before_delete callback to see if the deletion would leave >> the one side open and then return false if it would. >> >> > Sorry, it's before_destroy > > > -- > Andrew Timberlake > http://ramblingsonrails.com > http://www.linkedin.com/in/andrewtimberlake > > "I have never let my schooling interfere with my education" - Mark Twain > > > > -- Greg http://blog.gregnet.org/ --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---

