在Rails 5.1中,我有以下关系:
以下是它们的迁移:
我的目标是将“common_areas”与“root_areas”连接起来,使用“area_id”而不仅仅是“id”,以便单个根区域条目可以拥有多个公共区域。
例如,美国(RootArea)有加利福尼亚州(CommonArea)、德克萨斯州(CommonArea)等。
我尝试使用迁移和外键来实现这一点,如下所示:
输出结果表明Rails试图将
例如,在上面的示例中,生成的SQL语句应该将
class RootArea < ApplicationRecord
has_many :common_areas
end
class CommonArea < ApplicationRecord
belongs_to :root_area, foreign_key: 'area_id', optional: true
end
以下是它们的迁移:
create_table "root_areas", force: :cascade do |t|
t.integer "area_id"
t.string "localname"
t.string "globalname"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "common_areas", force: :cascade do |t|
t.integer "area_id"
t.string "localname"
t.string "globalname"
t.integer :root_area_id
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
我的目标是将“common_areas”与“root_areas”连接起来,使用“area_id”而不仅仅是“id”,以便单个根区域条目可以拥有多个公共区域。
例如,美国(RootArea)有加利福尼亚州(CommonArea)、德克萨斯州(CommonArea)等。
我尝试使用迁移和外键来实现这一点,如下所示:
add_foreign_key :common_areas, :root_areas, primary_key: :area_id
一开始似乎效果不错,但最终失败了:
>>> RootArea.create!(area_id: 1111,
localname: ’test',
globalname: ’test') # OK
>>> CommonArea.create!(area_id: 9999,
localname: ’test',
globalname: ’test') # OK
>>> RootArea.first.common_areas << CommonArea.first # Error
=> # SQL (44.3ms) UPDATE "common_areas" SET "root_area_id" = $1, "updated_at" = $2 WHERE "common_areas"."id" = $3 [["root_area_id", 19], ["updated_at", "2018-02-20 14:45:52.545450"], ["id", 1]]
输出结果表明Rails试图将
CommonArea
的属性root_area_id
设置为RootArea
的主键(id
而不是area_id
)。例如,在上面的示例中,生成的SQL语句应该将
root_area_id
设置为1111
,而不是19
。
belongs_to
美国,德克萨斯州belongs_to
美国等。但我还需要能够执行USA.common_areas并输出加利福尼亚州、德克萨斯州等。最好的方法是什么? - stratis