Skip to content

Commit 207f266

Browse files
committed
define_attr_method must serialize nil correctly
1 parent 099a210 commit 207f266

File tree

5 files changed

+21
-3
lines changed

5 files changed

+21
-3
lines changed

activemodel/lib/active_model/attribute_methods.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ def define_attr_method(name, value=nil, &block)
109109
# use eval instead of a block to work around a memory leak in dev
110110
# mode in fcgi
111111
sing.class_eval <<-eorb, __FILE__, __LINE__ + 1
112-
def #{name}; #{value.to_s.inspect}; end
112+
def #{name}; #{value.nil? ? 'nil' : value.to_s.inspect}; end
113113
eorb
114114
end
115115
end

activerecord/lib/active_record/attribute_methods/primary_key.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,19 @@ def reset_primary_key #:nodoc:
2424
end
2525

2626
def get_primary_key(base_name) #:nodoc:
27-
return unless base_name
27+
return unless base_name && !base_name.blank?
2828

2929
case primary_key_prefix_type
3030
when :table_name
3131
base_name.foreign_key(false)
3232
when :table_name_with_underscore
3333
base_name.foreign_key
3434
else
35-
'id'
35+
if ActiveRecord::Base != self && connection.table_exists?(table_name)
36+
connection.primary_key(table_name)
37+
else
38+
'id'
39+
end
3640
end
3741
end
3842

activerecord/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ def setup
99
:timeout => 100
1010
end
1111

12+
def test_primary_key_returns_nil_for_no_pk
13+
@conn.exec_query('create table ex(id int, data string)')
14+
assert_nil @conn.primary_key('ex')
15+
end
16+
1217
def test_connection_no_db
1318
assert_raises(ArgumentError) do
1419
Base.sqlite3_connection {}

activerecord/test/cases/associations/join_model_test.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,10 @@ def test_create_associate_when_adding_to_has_many_through
512512
assert_nothing_raised { vertices(:vertex_1).sinks << vertices(:vertex_5) }
513513
end
514514

515+
def test_add_to_join_table_with_no_id
516+
assert_nothing_raised { vertices(:vertex_1).sinks << vertices(:vertex_5) }
517+
end
518+
515519
def test_has_many_through_collection_size_doesnt_load_target_if_not_loaded
516520
author = authors(:david)
517521
assert_equal 10, author.comments.size

activerecord/test/cases/base_test.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
require 'models/warehouse_thing'
2020
require 'models/parrot'
2121
require 'models/loose_person'
22+
require 'models/edge'
2223
require 'rexml/document'
2324
require 'active_support/core_ext/exception'
2425

@@ -48,6 +49,10 @@ class Boolean < ActiveRecord::Base; end
4849
class BasicsTest < ActiveRecord::TestCase
4950
fixtures :topics, :companies, :developers, :projects, :computers, :accounts, :minimalistics, 'warehouse-things', :authors, :categorizations, :categories, :posts
5051

52+
def test_primary_key_with_no_id
53+
assert_nil Edge.primary_key
54+
end
55+
5156
def test_select_symbol
5257
topic_ids = Topic.select(:id).map(&:id).sort
5358
assert_equal Topic.find(:all).map(&:id).sort, topic_ids

0 commit comments

Comments
 (0)