gpt4 book ai didi

ruby-on-rails - 模型可以属于 STI child 吗?

转载 作者:行者123 更新时间:2023-12-05 00:59:37 26 4
gpt4 key购买 nike

我有一个基类 Place以及使用 STI 约定的多个子类。我有一个单独的模型Post , 其中 belongs_to Place 的子类之一:

class Place < ApplicationRecord
end

class SubPlace < Place
has_many :posts, class_name: "SubPlace", foreign_key: "sub_place_id"
end

class Post < ApplicationRecord
belongs_to :sub_place, class_name: "SubPlace", foreign_key: "sub_place_id"
end

可以保存一个新的Post使用 Rails 控制台记录,但在尝试查找 Posts 时出现以下错误对于特定的 SubPlace :

ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR:  column places.sub_place_id does not exist)

有没有办法让这个工作,或者我的关联必须只与基类相关?

添加架构:

create_table "posts", force: :cascade do |t|
t.string "title"
t.bigint "sub_place_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["sub_place_id"], name: "index_posts_on_sub_place_id"
end

create_table "places", force: :cascade do |t|
t.string "name"
t.string "type"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end

最佳答案

处理关联和 STI 的更好方法是将关联设置到基类:

class Place < ApplicationRecord
end

class SubPlace < Place
has_many :posts, foreign_key: 'place_id', inverse_of: 'place'
end

class AnotherKindOfPlace < Place
has_many :posts, foreign_key: 'place_id', inverse_of: 'place'
end

class Post < ApplicationRecord
belongs_to :place
end

这让事情变得简单明了,因为 Post 不知道也不关心有不同种类的地方。当您访问 @post.place 时,ActiveRecord 会读取 places.type 列并实例化正确的子类型。

如果基础 Post 类也有关联,您只需将其写为:

class Place < ApplicationRecord
has_many :posts, foreign_key: 'place_id', inverse_of: 'place'
end

关于ruby-on-rails - 模型可以属于 STI child 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52923550/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com