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

i2loujxw  于 2023-10-21  发布在  Ruby
关注(0)|答案(2)|浏览(130)

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

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

可以使用Rails控制台保存一个新的Post记录,但是当我试图为一个特定的SubPlace查找Posts时,得到了以下错误:

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

有没有办法让它工作,或者我的关联必须只与基类相关?
新增Schema:

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
chhqkbe1

chhqkbe11#

处理关联和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列并将示例化正确的子类型。
如果基础Place类也有关联,你只需要把它写为:

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

r1zhe5dt2#

ActiveRecord::StatementInvalid(PG::UndefinedColumn:错误:列位置.sub_place_id不存在)
您在SubPlace中的关联无效。你应该重写一下

class SubPlace < Place
  has_many :posts
end

相关问题