Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions lib/ridgepole/dsl_parser/table_definition.rb
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ def references(*args)
polymorphic_options.merge!(options.slice(:null, :first, :after))
index_options = options.key?(:index) ? options.delete(:index) : true
type = options.delete(:type) || DEFAULT_PRIMARY_KEY_TYPE
foreign_key_options = options.delete(:foreign_key)

args.each do |col|
column("#{col}_id", type, options)
Expand All @@ -139,6 +140,12 @@ def references(*args)
columns = polymorphic ? ["#{col}_type", "#{col}_id"] : ["#{col}_id"]
index(columns, index_options.is_a?(Hash) ? index_options : {})
end
if foreign_key_options # rubocop:disable Style/Next
fk_opts = foreign_key_options.is_a?(Hash) ? foreign_key_options.dup : {}
fk_opts.update(column: "#{col}_id") if col.to_s.singularize != col.to_s
to_table = fk_opts.delete(:to_table) || col
@base.add_foreign_key(@table_name, to_table, fk_opts)
end
end
end
alias belongs_to references
Expand Down
122 changes: 122 additions & 0 deletions spec/mysql/migrate/migrate_change_column3_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -310,4 +310,126 @@
expect(subject.dump).to match_ruby expected_dsl
}
end

context 'when use references with fk (no change)' do
let(:actual_dsl) do
erbh(<<-ERB)
create_table "products", force: :cascade do |t|
end

create_table "user", force: :cascade do |t|
end

create_table "employees", primary_key: "emp_no", force: :cascade do |t|
t.date "birth_date", null: false
t.string "first_name", limit: 14, null: false
t.string "last_name", limit: 16, null: false
t.string "gender", limit: 1, null: false
t.date "hire_date", null: false
t.<%= cond('>= 5.1','bigint', 'integer') %> "products_id"
t.<%= cond('>= 5.1','bigint', 'integer') %> "user_id"
t.index "products_id"
t.index "user_id"
end

add_foreign_key("employees", "products", **{:column=>"products_id"})
add_foreign_key("employees", "user")
ERB
end

let(:expected_dsl) do
erbh(<<-ERB)
create_table "products", force: :cascade do |t|
end

create_table "user", force: :cascade do |t|
end

create_table "employees", primary_key: "emp_no", force: :cascade do |t|
t.date "birth_date", null: false
t.string "first_name", limit: 14, null: false
t.string "last_name", limit: 16, null: false
t.string "gender", limit: 1, null: false
t.date "hire_date", null: false
t.references :products, :user, foreign_key: true
end
ERB
end

before { subject.diff(actual_dsl).migrate }
subject { client }

it {
delta = subject.diff(expected_dsl)
expect(delta.differ?).to be_falsey
}
end

context 'when use references with fk (change)' do
let(:actual_dsl) do
erbh(<<-ERB)
create_table "employees", primary_key: "emp_no", force: :cascade do |t|
t.date "birth_date", null: false
t.string "first_name", limit: 14, null: false
t.string "last_name", limit: 16, null: false
t.string "gender", limit: 1, null: false
t.date "hire_date", null: false
end
create_table "products", force: :cascade do |t|
end
create_table "user", force: :cascade do |t|
end
ERB
end

let(:dsl) do
erbh(<<-ERB)
create_table "employees", primary_key: "emp_no", force: :cascade do |t|
t.date "birth_date", null: false
t.string "first_name", limit: 14, null: false
t.string "last_name", limit: 16, null: false
t.string "gender", limit: 1, null: false
t.date "hire_date", null: false
t.references :products, :user, foreign_key: true
end
create_table "products", force: :cascade do |t|
end
create_table "user", force: :cascade do |t|
end
ERB
end

let(:expected_dsl) do
erbh(<<-ERB)
create_table "employees", primary_key: "emp_no", force: :cascade do |t|
t.date "birth_date", null: false
t.string "first_name", limit: 14, null: false
t.string "last_name", limit: 16, null: false
t.string "gender", limit: 1, null: false
t.date "hire_date", null: false
t.<%= cond('>= 5.1','bigint', 'integer') %> "products_id"
t.<%= cond('>= 5.1','bigint', 'integer') %> "user_id"
t.index ["products_id"], name: "index_employees_on_products_id", <%= i cond(5.0, using: :btree) %>
t.index ["user_id"], name: "index_employees_on_user_id", <%= i cond(5.0, using: :btree) %>
end
create_table "products", force: :cascade do |t|
end
create_table "user", force: :cascade do |t|
end
add_foreign_key("employees", "products", column: "products_id")
add_foreign_key("employees", "user")
ERB
end

before { subject.diff(actual_dsl).migrate }
subject { client }

it {
delta = subject.diff(dsl)
expect(delta.differ?).to be_truthy
expect(subject.dump).to match_ruby actual_dsl
delta.migrate
expect(subject.dump).to match_ruby expected_dsl
}
end
end
4 changes: 4 additions & 0 deletions spec/spec_condition.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ def activerecord_5?
def debug?
ENV['DEBUG'] == '1'
end

def verbose?
ENV['VERBOSE'] == '1'
end
end

def check_version_or_cond(version_or_cond)
Expand Down
3 changes: 2 additions & 1 deletion spec/spec_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,11 @@

RSpec.configure do |config|
config.before(:all) do
if condition(:debug)
if condition(:debug) || condition(:verbose)
ActiveRecord::Migration.verbose = true
logger = Ridgepole::Logger.instance
logger.level = ::Logger::DEBUG
logger.verbose = condition(:verbose)
ActiveRecord::Base.logger = logger
else
ActiveRecord::Migration.verbose = false
Expand Down