为什么我的 Rails 7 Join Table 在我输入控制台命令后才被创建?
Why is my Rails 7 Join Table not being created until I enter console commands?
我为项目创建了 table,为工作创建了 table。然后我创建了一个连接 table,Items Jobs.
这是我对连接 table 和模型的迁移:
class CreateItemsJobs < ActiveRecord::Migration[7.0]
def change
create_table :items_jobs, id: false do |t|
t.belongs_to :item
t.belongs_to :job
t.timestamps
end
end
end
class Item < ApplicationRecord
belongs_to :part
belongs_to :employee, optional: true
has_and_belongs_to_many :jobs
end
class Job < ApplicationRecord
belongs_to :client
belongs_to :employee
has_and_belongs_to_many :items
end
class ItemsJobs < ApplicationRecord
belongs_to :item
belongs_to :job
end
然后我就成功迁移了...
rails db:migrate ==>
== 20220210032352 CreateItemsJobs: migrating ==================================
-- create_table(:items_jobs, {:id=>false})
-> 0.0085s
== 20220210032352 CreateItemsJobs: migrated (0.0086s) =========================
但是如果我尝试播种,我会收到错误消息。如果我 运行 我的 rails 控制台,我无法添加到 table 直到我 尝试 查看 table不存在。
rails c ==>
Loading development environment (Rails 7.0.1)
2.7.4 :001 > ItemsJobs.all
Traceback (most recent call last):
(irb):1:in `<main>': uninitialized constant ItemsJobs (NameError)
Did you mean? ItemJob
2.7.4 :002 > ItemJob.all
Traceback (most recent call last):
(irb):2:in `<main>': uninitialized constant ItemJob (NameError)
Did you mean? ItemsJobs
2.7.4 :003 > ItemsJobs.all
ItemsJobs Load (0.4ms) SELECT "items_jobs".* FROM "items_jobs"
=> []
2.7.4 :004 > ItemsJobs.create(item_id: 1, job_id: 1)
TRANSACTION (0.2ms) BEGIN1 LIMIT [["id", 1], ["LIMIT", 1]]
Job Load (0.3ms) SELECT "jobs".* FROM "jobs" WHERE "jobs"."id" = LIMIT [["id", 1], ["LIMIT", 1]]
ItemsJobs Create (0.6ms) INSERT INTO "items_jobs" ("item_id", "job_id", "created_at", "updated_at") VALUES (, , , ) [["item_id", 1], ["job_id", 1], ["created_at", "2022-02-10 15:23:44.127164"], ["updated_at", "2022-02-10 15:23:44.127164"]]
TRANSACTION (1.1ms) COMMIT
=>
#<ItemsJobs:0x00007f33c0aa7a80
item_id: 1,
job_id: 1,
created_at: Thu, 10 Feb 2022 15:23:44.127164000 UTC +00:00,
updated_at: Thu, 10 Feb 2022 15:23:44.127164000 UTC +00:00>
这里出了什么问题?为什么我不能 view/add 到 ItemsJobs table,直到我尝试查看建议的、不存在的 ItemJob table?
你混淆了 has_and_belongs_to_many
和 has_many through:
并且奇怪的自动加载行为很可能是因为命名方案抛弃了 ActiveRecord 将 classes 映射到数据库的方式 tables 通过约定优于配置。经验法则是 ActiveRecord 期望模型(class 名称)是单数,而 tables 是复数。
HABTM 协会不使用模型进行连接 table。相反,它只是一个“无头”关联,您只是在每一端的关联中隐式 add/remove 行。 HABTM 实际上仅适用于您知道不需要直接查询 table 或访问任何其他列的情况 - 换句话说,它在该利基市场之外毫无用处。 HABTM 是 ActiveRecord 中唯一使用 table 的 plural_plural
命名方案的地方 - 除非您显式配置所有内容,否则将该方案与模型一起使用会导致不断的查找错误。
如果你想设置一个与连接模型的关联(我会推荐这个)你需要正确命名 class 和 table 并使用间接关联:
class CreateItemJobs < ActiveRecord::Migration[7.0]
def change
# table name should be singular_plural
create_table :item_jobs do |t|
t.belongs_to :item
t.belongs_to :job
t.timestamps
end
end
end
# model class names should always be singular
class ItemJob < ApplicationRecord
belongs_to :item
belongs_to :job
end
class Item < ApplicationRecord
belongs_to :part
belongs_to :employee, optional: true
has_many :item_jobs
has_many :jobs, through: :item_jobs
end
class Job < ApplicationRecord
belongs_to :client
belongs_to :employee
has_many :item_jobs
has_many :items, through: :item_jobs
end
由于您可能没有 运行 生产迁移并且 table 中没有任何有意义的数据,您可以回滚错误的 CreateItemsJobs
迁移并将其删除. rails g model ItemJob item:belongs_to job:belongs_to
将同时创建模型和迁移。
参见:
我为项目创建了 table,为工作创建了 table。然后我创建了一个连接 table,Items Jobs.
这是我对连接 table 和模型的迁移:
class CreateItemsJobs < ActiveRecord::Migration[7.0]
def change
create_table :items_jobs, id: false do |t|
t.belongs_to :item
t.belongs_to :job
t.timestamps
end
end
end
class Item < ApplicationRecord
belongs_to :part
belongs_to :employee, optional: true
has_and_belongs_to_many :jobs
end
class Job < ApplicationRecord
belongs_to :client
belongs_to :employee
has_and_belongs_to_many :items
end
class ItemsJobs < ApplicationRecord
belongs_to :item
belongs_to :job
end
然后我就成功迁移了...
rails db:migrate ==>
== 20220210032352 CreateItemsJobs: migrating ==================================
-- create_table(:items_jobs, {:id=>false})
-> 0.0085s
== 20220210032352 CreateItemsJobs: migrated (0.0086s) =========================
但是如果我尝试播种,我会收到错误消息。如果我 运行 我的 rails 控制台,我无法添加到 table 直到我 尝试 查看 table不存在。
rails c ==>
Loading development environment (Rails 7.0.1)
2.7.4 :001 > ItemsJobs.all
Traceback (most recent call last):
(irb):1:in `<main>': uninitialized constant ItemsJobs (NameError)
Did you mean? ItemJob
2.7.4 :002 > ItemJob.all
Traceback (most recent call last):
(irb):2:in `<main>': uninitialized constant ItemJob (NameError)
Did you mean? ItemsJobs
2.7.4 :003 > ItemsJobs.all
ItemsJobs Load (0.4ms) SELECT "items_jobs".* FROM "items_jobs"
=> []
2.7.4 :004 > ItemsJobs.create(item_id: 1, job_id: 1)
TRANSACTION (0.2ms) BEGIN1 LIMIT [["id", 1], ["LIMIT", 1]]
Job Load (0.3ms) SELECT "jobs".* FROM "jobs" WHERE "jobs"."id" = LIMIT [["id", 1], ["LIMIT", 1]]
ItemsJobs Create (0.6ms) INSERT INTO "items_jobs" ("item_id", "job_id", "created_at", "updated_at") VALUES (, , , ) [["item_id", 1], ["job_id", 1], ["created_at", "2022-02-10 15:23:44.127164"], ["updated_at", "2022-02-10 15:23:44.127164"]]
TRANSACTION (1.1ms) COMMIT
=>
#<ItemsJobs:0x00007f33c0aa7a80
item_id: 1,
job_id: 1,
created_at: Thu, 10 Feb 2022 15:23:44.127164000 UTC +00:00,
updated_at: Thu, 10 Feb 2022 15:23:44.127164000 UTC +00:00>
这里出了什么问题?为什么我不能 view/add 到 ItemsJobs table,直到我尝试查看建议的、不存在的 ItemJob table?
你混淆了 has_and_belongs_to_many
和 has_many through:
并且奇怪的自动加载行为很可能是因为命名方案抛弃了 ActiveRecord 将 classes 映射到数据库的方式 tables 通过约定优于配置。经验法则是 ActiveRecord 期望模型(class 名称)是单数,而 tables 是复数。
HABTM 协会不使用模型进行连接 table。相反,它只是一个“无头”关联,您只是在每一端的关联中隐式 add/remove 行。 HABTM 实际上仅适用于您知道不需要直接查询 table 或访问任何其他列的情况 - 换句话说,它在该利基市场之外毫无用处。 HABTM 是 ActiveRecord 中唯一使用 table 的 plural_plural
命名方案的地方 - 除非您显式配置所有内容,否则将该方案与模型一起使用会导致不断的查找错误。
如果你想设置一个与连接模型的关联(我会推荐这个)你需要正确命名 class 和 table 并使用间接关联:
class CreateItemJobs < ActiveRecord::Migration[7.0]
def change
# table name should be singular_plural
create_table :item_jobs do |t|
t.belongs_to :item
t.belongs_to :job
t.timestamps
end
end
end
# model class names should always be singular
class ItemJob < ApplicationRecord
belongs_to :item
belongs_to :job
end
class Item < ApplicationRecord
belongs_to :part
belongs_to :employee, optional: true
has_many :item_jobs
has_many :jobs, through: :item_jobs
end
class Job < ApplicationRecord
belongs_to :client
belongs_to :employee
has_many :item_jobs
has_many :items, through: :item_jobs
end
由于您可能没有 运行 生产迁移并且 table 中没有任何有意义的数据,您可以回滚错误的 CreateItemsJobs
迁移并将其删除. rails g model ItemJob item:belongs_to job:belongs_to
将同时创建模型和迁移。
参见: