提交 85683f2a 编写于 作者: S Szymon Nowak 提交者: Aaron Patterson

Fix creation of has_many through records with custom primary_key option on...

Fix creation of has_many through records with custom primary_key option on belongs_to [#2990 state:resolved]
上级 b7982383
...@@ -106,7 +106,12 @@ def construct_join_attributes(associate) ...@@ -106,7 +106,12 @@ def construct_join_attributes(associate)
# TODO: revisit this to allow it for deletion, supposing dependent option is supported # TODO: revisit this to allow it for deletion, supposing dependent option is supported
raise ActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection.new(@owner, @reflection) if [:has_one, :has_many].include?(@reflection.source_reflection.macro) raise ActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection.new(@owner, @reflection) if [:has_one, :has_many].include?(@reflection.source_reflection.macro)
join_attributes = construct_owner_attributes(@reflection.through_reflection).merge(@reflection.source_reflection.primary_key_name => associate.id) join_attributes = construct_owner_attributes(@reflection.through_reflection)
join_attributes.merge!(
@reflection.source_reflection.primary_key_name =>
associate.send(@reflection.source_reflection.association_primary_key)
)
if @reflection.options[:source_type] if @reflection.options[:source_type]
join_attributes.merge!(@reflection.source_reflection.options[:foreign_type] => associate.class.base_class.name) join_attributes.merge!(@reflection.source_reflection.options[:foreign_type] => associate.class.base_class.name)
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
require 'models/category' require 'models/category'
class HasManyThroughAssociationsTest < ActiveRecord::TestCase class HasManyThroughAssociationsTest < ActiveRecord::TestCase
fixtures :posts, :readers, :people, :comments, :authors, fixtures :posts, :readers, :people, :comments, :authors, :categories,
:owners, :pets, :toys, :jobs, :references, :companies, :owners, :pets, :toys, :jobs, :references, :companies,
:subscribers, :books, :subscriptions, :developers, :categorizations :subscribers, :books, :subscriptions, :developers, :categorizations
...@@ -397,6 +397,34 @@ def test_has_many_association_through_a_has_many_association_to_self ...@@ -397,6 +397,34 @@ def test_has_many_association_through_a_has_many_association_to_self
assert_equal people(:susan).agents.map(&:agents).flatten, people(:susan).agents_of_agents assert_equal people(:susan).agents.map(&:agents).flatten, people(:susan).agents_of_agents
end end
def test_associate_existing_with_nonstandard_primary_key_on_belongs_to
Categorization.create(:author => authors(:mary), :named_category_name => categories(:general).name)
assert_equal categories(:general), authors(:mary).named_categories.first
end
def test_collection_build_with_nonstandard_primary_key_on_belongs_to
author = authors(:mary)
category = author.named_categories.build(:name => "Primary")
author.save
assert Categorization.exists?(:author_id => author.id, :named_category_name => category.name)
assert author.named_categories(true).include?(category)
end
def test_collection_create_with_nonstandard_primary_key_on_belongs_to
author = authors(:mary)
category = author.named_categories.create(:name => "Primary")
assert Categorization.exists?(:author_id => author.id, :named_category_name => category.name)
assert author.named_categories(true).include?(category)
end
def test_collection_delete_with_nonstandard_primary_key_on_belongs_to
author = authors(:mary)
category = author.named_categories.create(:name => "Primary")
author.named_categories.delete(category)
assert !Categorization.exists?(:author_id => author.id, :named_category_name => category.name)
assert author.named_categories(true).empty?
end
def test_collection_singular_ids_getter_with_string_primary_keys def test_collection_singular_ids_getter_with_string_primary_keys
book = books(:awdr) book = books(:awdr)
assert_equal 2, book.subscriber_ids.size assert_equal 2, book.subscriber_ids.size
......
...@@ -78,6 +78,7 @@ def testing_proxy_target ...@@ -78,6 +78,7 @@ def testing_proxy_target
has_many :categorizations has_many :categorizations
has_many :categories, :through => :categorizations has_many :categories, :through => :categorizations
has_many :named_categories, :through => :categorizations
has_many :special_categorizations has_many :special_categorizations
has_many :special_categories, :through => :special_categorizations, :source => :category has_many :special_categories, :through => :special_categorizations, :source => :category
......
class Categorization < ActiveRecord::Base class Categorization < ActiveRecord::Base
belongs_to :post belongs_to :post
belongs_to :category belongs_to :category
belongs_to :named_category, :class_name => 'Category', :foreign_key => :named_category_name, :primary_key => :name
belongs_to :author belongs_to :author
belongs_to :author_using_custom_pk, :class_name => 'Author', :foreign_key => :author_id, :primary_key => :author_address_extra_id belongs_to :author_using_custom_pk, :class_name => 'Author', :foreign_key => :author_id, :primary_key => :author_address_extra_id
......
...@@ -110,6 +110,7 @@ def create_table(*args, &block) ...@@ -110,6 +110,7 @@ def create_table(*args, &block)
create_table :categorizations, :force => true do |t| create_table :categorizations, :force => true do |t|
t.column :category_id, :integer t.column :category_id, :integer
t.string :named_category_name
t.column :post_id, :integer t.column :post_id, :integer
t.column :author_id, :integer t.column :author_id, :integer
t.column :special, :boolean t.column :special, :boolean
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册