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.

-- 
Andrew Timberlake
http://ramblingsonrails.com
http://www.linkedin.com/in/andrewtimberlake

"I have never let my schooling interfere with my education" - Mark Twain

--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to