具有现有模型名称的外键
Foreign key with a name of an existing model
我有以下迁移:
class CreateTables < ActiveRecord::Migration[5.2]
def change
create_table "customers" do |t|
t.string "name"
end
create_table "items" do |t|
t.integer "customer"
end
end
end
和型号:
class Customer < ApplicationRecord
has_many :items, foreign_key: :customer
end
class Item < ApplicationRecord
belongs_to :customer, foreign_key: :customer
end
以下代码无限循环,因为 foreign key
中使用的列与现有模型同名:
2.5.1 :001 > Customer.create(name: "John")
=> #<Customer id: 1, name: "John">
2.5.1 :002 > Customer.first
=> #<Customer id: 1, name: "John">
2.5.1 :003 > Customer.first.items
Traceback (most recent call last):
SystemStackError (stack level too deep)
如何引用名称与现有名称冲突的列?
最合适的解决方案似乎是将外键列 customer
重命名为 customer_id
,但如果您真的需要将列命名为 customer
,只需更改关联的名称,因为这就是 Rails 感到困惑的地方。例如:
class Item < ApplicationRecord
belongs_to :item_customer, foreign_key: :customer, class_name: 'Customer'
end
注意,当class名称无法从关联名称中推断出来时,您必须使用class_name: 'Customer'
指定它
我有以下迁移:
class CreateTables < ActiveRecord::Migration[5.2]
def change
create_table "customers" do |t|
t.string "name"
end
create_table "items" do |t|
t.integer "customer"
end
end
end
和型号:
class Customer < ApplicationRecord
has_many :items, foreign_key: :customer
end
class Item < ApplicationRecord
belongs_to :customer, foreign_key: :customer
end
以下代码无限循环,因为 foreign key
中使用的列与现有模型同名:
2.5.1 :001 > Customer.create(name: "John")
=> #<Customer id: 1, name: "John">
2.5.1 :002 > Customer.first
=> #<Customer id: 1, name: "John">
2.5.1 :003 > Customer.first.items
Traceback (most recent call last):
SystemStackError (stack level too deep)
如何引用名称与现有名称冲突的列?
最合适的解决方案似乎是将外键列 customer
重命名为 customer_id
,但如果您真的需要将列命名为 customer
,只需更改关联的名称,因为这就是 Rails 感到困惑的地方。例如:
class Item < ApplicationRecord
belongs_to :item_customer, foreign_key: :customer, class_name: 'Customer'
end
注意,当class名称无法从关联名称中推断出来时,您必须使用class_name: 'Customer'