Permalink
Browse files

has_many :through create should not raise validation errors

[#2934 state:committed]

Signed-off-by: Jeremy Kemper <jeremy@bitsweat.net>
  • Loading branch information...
1 parent cc3183d commit 33c054d7e04672201e120a0f8da38166650f3a94 @croaky croaky committed with jeremy Aug 10, 2009
@@ -17,7 +17,17 @@ def create!(attrs = nil)
def create(attrs = nil)
transaction do
- self << (object = attrs ? @reflection.klass.send(:with_scope, :create => attrs) { @reflection.create_association } : @reflection.create_association)
+ object = if attrs
+ @reflection.klass.send(:with_scope, :create => attrs) {
+ @reflection.create_association
+ }
+ else
+ @reflection.create_association
+ end
+ raise_on_type_mismatch(object)
+ add_record_to_target_with_callbacks(object) do |r|
+ insert_record(object, false)
+ end
object
end
end
@@ -11,9 +11,13 @@
require 'models/owner'
require 'models/pet'
require 'models/toy'
+require 'models/contract'
+require 'models/company'
+require 'models/developer'
class HasManyThroughAssociationsTest < ActiveRecord::TestCase
- fixtures :posts, :readers, :people, :comments, :authors, :owners, :pets, :toys
+ fixtures :posts, :readers, :people, :comments, :authors, :owners, :pets, :toys,
+ :companies
def test_associate_existing
assert_queries(2) { posts(:thinking);people(:david) }
@@ -157,6 +161,30 @@ def test_associate_with_create_exclamation_and_no_options
assert_equal peeps + 1, posts(:thinking).people.count
end
+ def test_associate_with_create_and_invalid_options
+ peeps = companies(:first_firm).developers.count
+ assert_nothing_raised { companies(:first_firm).developers.create(:name => '0') }
+ assert_equal peeps, companies(:first_firm).developers.count
+ end
+
+ def test_associate_with_create_and_valid_options
+ peeps = companies(:first_firm).developers.count
+ assert_nothing_raised { companies(:first_firm).developers.create(:name => 'developer') }
+ assert_equal peeps + 1, companies(:first_firm).developers.count
+ end
+
+ def test_associate_with_create_bang_and_invalid_options
+ peeps = companies(:first_firm).developers.count
+ assert_raises(ActiveRecord::RecordInvalid) { companies(:first_firm).developers.create!(:name => '0') }
+ assert_equal peeps, companies(:first_firm).developers.count
+ end
+
+ def test_associate_with_create_bang_and_valid_options
+ peeps = companies(:first_firm).developers.count
+ assert_nothing_raised { companies(:first_firm).developers.create!(:name => 'developer') }
+ assert_equal peeps + 1, companies(:first_firm).developers.count
+ end
+
def test_clear_associations
assert_queries(2) { posts(:welcome);posts(:welcome).people(true) }
@@ -170,8 +170,8 @@ def test_association_reflection_in_modules
def test_reflection_of_all_associations
# FIXME these assertions bust a lot
- assert_equal 28, Firm.reflect_on_all_associations.size
- assert_equal 21, Firm.reflect_on_all_associations(:has_many).size
+ assert_equal 30, Firm.reflect_on_all_associations.size
+ assert_equal 23, Firm.reflect_on_all_associations(:has_many).size
assert_equal 7, Firm.reflect_on_all_associations(:has_one).size
assert_equal 0, Firm.reflect_on_all_associations(:belongs_to).size
end
@@ -9,6 +9,8 @@ class Company < AbstractCompany
validates_presence_of :name
has_one :dummy_account, :foreign_key => "firm_id", :class_name => "Account"
+ has_many :contracts
+ has_many :developers, :through => :contracts
def arbitrary_method
"I am Jack's profound disappointment"
@@ -0,0 +1,5 @@
+class Contract < ActiveRecord::Base
+ belongs_to :company
+ belongs_to :developer
+end
+
@@ -125,6 +125,10 @@ def create_table(*args, &block)
t.integer :extendedWarranty, :null => false
end
+ create_table :contracts, :force => true do |t|
+ t.integer :developer_id
+ t.integer :company_id
+ end
create_table :customers, :force => true do |t|
t.string :name

0 comments on commit 33c054d

Please sign in to comment.