Merge pull request #47635 from Shopify/generate-composite-pk-in-fixtures
Fix fixtures id generation for composite primary keys
This commit is contained in:
commit
3c0569ec17
@ -12,12 +12,22 @@ def primary_key_name
|
||||
end
|
||||
|
||||
def primary_key_type
|
||||
@primary_key_type ||= @model_class && @model_class.type_for_attribute(@model_class.primary_key).type
|
||||
@primary_key_type ||= @model_class && column_type(@model_class.primary_key)
|
||||
end
|
||||
|
||||
def has_primary_key_column?
|
||||
@has_primary_key_column ||= primary_key_name &&
|
||||
@model_class.columns.any? { |col| col.name == primary_key_name }
|
||||
def column_type(column_name)
|
||||
@column_type ||= {}
|
||||
return @column_type[column_name] if @column_type.key?(column_name)
|
||||
|
||||
@column_type[column_name] = @model_class && @model_class.type_for_attribute(column_name).type
|
||||
end
|
||||
|
||||
def has_column?(column_name)
|
||||
column_names.include?(column_name)
|
||||
end
|
||||
|
||||
def column_names
|
||||
@column_names ||= @model_class ? @model_class.columns.map(&:name).to_set : Set.new
|
||||
end
|
||||
|
||||
def timestamp_column_names
|
||||
|
@ -118,10 +118,10 @@ def interpolate_label
|
||||
|
||||
def generate_primary_key
|
||||
# generate a primary key if necessary
|
||||
if model_metadata.has_primary_key_column? && !@row.include?(model_metadata.primary_key_name)
|
||||
@row[model_metadata.primary_key_name] = ActiveRecord::FixtureSet.identify(
|
||||
@label, model_metadata.primary_key_type
|
||||
)
|
||||
Array(model_metadata.primary_key_name).each do |pk|
|
||||
next if !model_metadata.has_column?(pk) || @row.include?(pk)
|
||||
|
||||
@row[pk] = ActiveRecord::FixtureSet.identify(@label, model_metadata.column_type(pk))
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -33,6 +33,7 @@
|
||||
require "models/topic"
|
||||
require "models/traffic_light"
|
||||
require "models/treasure"
|
||||
require "models/cpk"
|
||||
|
||||
class FixturesTest < ActiveRecord::TestCase
|
||||
include ConnectionHelper
|
||||
@ -1627,4 +1628,15 @@ def readonly_config
|
||||
default_config.merge("replica" => true)
|
||||
end
|
||||
end
|
||||
|
||||
class CompositePkFixturesTest < ActiveRecord::TestCase
|
||||
fixtures :cpk_orders, :cpk_books
|
||||
|
||||
def test_generates_composite_primary_key_ids
|
||||
assert_not_empty(cpk_orders(:cpk_groceries_order_1).id.compact)
|
||||
|
||||
assert_not_nil(cpk_books(:cpk_great_author_first_book).author_id)
|
||||
assert_not_nil(cpk_books(:cpk_great_author_first_book).number)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
6
activerecord/test/fixtures/cpk_books.yml
vendored
6
activerecord/test/fixtures/cpk_books.yml
vendored
@ -2,19 +2,13 @@ _fixture:
|
||||
model_class: Cpk::Book
|
||||
|
||||
cpk_great_author_first_book:
|
||||
author_id: 1
|
||||
number: 1
|
||||
title: "The first book"
|
||||
revision: 1
|
||||
|
||||
cpk_great_author_second_book:
|
||||
author_id: 1
|
||||
number: 2
|
||||
title: "The second book"
|
||||
revision: 1
|
||||
|
||||
cpk_famous_author_first_book:
|
||||
author_id: 2
|
||||
number: 1
|
||||
title: "Ruby on Rails"
|
||||
revision: 1
|
||||
|
6
activerecord/test/fixtures/cpk_orders.yml
vendored
6
activerecord/test/fixtures/cpk_orders.yml
vendored
@ -2,16 +2,10 @@ _fixture:
|
||||
model_class: Cpk::Order
|
||||
|
||||
cpk_groceries_order_1:
|
||||
id: 1
|
||||
shop_id: 1
|
||||
status: "paid"
|
||||
|
||||
cpk_groceries_order_2:
|
||||
id: 2
|
||||
shop_id: 1
|
||||
status: "paid"
|
||||
|
||||
cpk_coffee_order_1:
|
||||
id: 3
|
||||
shop_id: 2
|
||||
status: "cancelled"
|
||||
|
Loading…
Reference in New Issue
Block a user