Rails 灯具中的标签关联因 "no columns named..." 而失败
Label associations in Rails fixtures failing with "no columns named..."
我正在尝试在我的简单 Rails (6) 项目中使用 Label references for associations,但出现“没有列名为...”的错误。
除其他外,我有 orders.yml
:
one:
name: Dave Thomas
address: MyText
email: dave@example.org
pay_type: credit_card
其中 pay_type
是对 pay_types.yml
中实体的引用:
credit_card:
description: Credit Card
但是,当我 运行 进行任何测试时,我看到固定装置失败:
Error:
OrderTest#test_order_attributes_must_not_be_empty:
ActiveRecord::Fixture::FixtureError: table "orders" has no columns named "pay_type".
/Users/sam/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.3/lib/active_record/connection_adapters/abstract/database_statements.rb:427:in `block in build_fixture_sql'
我可以通过直接引用 ID 来完成这项工作,但我宁愿不这样做:
pay_type_id: 1
Fixtures.identify
也按照 this answer 工作(如果我将文件重命名为具有 .yml.erb
扩展名):
pay_type_id: <%= Fixtures.identify(:credit_card) %>
但我真的很想让我的原始表单正常工作。
以下是相关模型的外观:
class Order < ApplicationRecord
has_many :line_items, dependent: :destroy
has_one :pay_type
validates :name, :address, :email, presence: true
validates_presence_of :pay_type
end
class PayType < ApplicationRecord
has_many :order
end
这是 schema.yml
的摘录:
create_table "orders", force: :cascade do |t|
t.string "name"
t.text "address"
t.string "email"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.integer "pay_type_id", null: false
t.index ["pay_type_id"], name: "index_orders_on_pay_type_id"
end
create_table "pay_types", force: :cascade do |t|
t.string "description"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
我尝试过但没有帮助的事情:
- Explicitly adding the model type:
pay_type: credit_card (PayType)
- Running
db:test:prepare
知道我可能做错了什么吗?
更新:我想这是我在 Order
模型上从 pay_type
字符串列切换到 pay_type_id
引用时做错了什么。
如果您想查看完整的项目代码库(它相当小):https://github.com/sampart/rails-book-depot/tree/pay-type-label-reference
上下文:我正在使用 Rails 6 进行 敏捷 Web 开发,并且正在执行将支付类型移动到数据库中的扩展任务。
问题出在我的关联上 - has_one
假设在关系的另一端有引用,因此在 PayType
.[=19 上寻找不存在的 order_id
列=]
当我将我的 Order
模型改成这个时:
belongs_to :pay_type
然后成功了。
虽然 https://guides.rubyonrails.org/association_basics.html#the-belongs-to-association 说“belongs_to
关联建立了与另一个模型的一对一连接”,但事实证明它们不仅仅是 用于一对一关系。
关键是 belongs_to
期望外键列位于添加声明本身的模型上。
我正在尝试在我的简单 Rails (6) 项目中使用 Label references for associations,但出现“没有列名为...”的错误。
除其他外,我有 orders.yml
:
one:
name: Dave Thomas
address: MyText
email: dave@example.org
pay_type: credit_card
其中 pay_type
是对 pay_types.yml
中实体的引用:
credit_card:
description: Credit Card
但是,当我 运行 进行任何测试时,我看到固定装置失败:
Error:
OrderTest#test_order_attributes_must_not_be_empty:
ActiveRecord::Fixture::FixtureError: table "orders" has no columns named "pay_type".
/Users/sam/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.3/lib/active_record/connection_adapters/abstract/database_statements.rb:427:in `block in build_fixture_sql'
我可以通过直接引用 ID 来完成这项工作,但我宁愿不这样做:
pay_type_id: 1
Fixtures.identify
也按照 this answer 工作(如果我将文件重命名为具有 .yml.erb
扩展名):
pay_type_id: <%= Fixtures.identify(:credit_card) %>
但我真的很想让我的原始表单正常工作。
以下是相关模型的外观:
class Order < ApplicationRecord
has_many :line_items, dependent: :destroy
has_one :pay_type
validates :name, :address, :email, presence: true
validates_presence_of :pay_type
end
class PayType < ApplicationRecord
has_many :order
end
这是 schema.yml
的摘录:
create_table "orders", force: :cascade do |t|
t.string "name"
t.text "address"
t.string "email"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.integer "pay_type_id", null: false
t.index ["pay_type_id"], name: "index_orders_on_pay_type_id"
end
create_table "pay_types", force: :cascade do |t|
t.string "description"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
我尝试过但没有帮助的事情:
- Explicitly adding the model type:
pay_type: credit_card (PayType)
- Running
db:test:prepare
知道我可能做错了什么吗?
更新:我想这是我在 Order
模型上从 pay_type
字符串列切换到 pay_type_id
引用时做错了什么。
如果您想查看完整的项目代码库(它相当小):https://github.com/sampart/rails-book-depot/tree/pay-type-label-reference
上下文:我正在使用 Rails 6 进行 敏捷 Web 开发,并且正在执行将支付类型移动到数据库中的扩展任务。
问题出在我的关联上 - has_one
假设在关系的另一端有引用,因此在 PayType
.[=19 上寻找不存在的 order_id
列=]
当我将我的 Order
模型改成这个时:
belongs_to :pay_type
然后成功了。
虽然 https://guides.rubyonrails.org/association_basics.html#the-belongs-to-association 说“belongs_to
关联建立了与另一个模型的一对一连接”,但事实证明它们不仅仅是 用于一对一关系。
关键是 belongs_to
期望外键列位于添加声明本身的模型上。