Ruby on rails 当外键存储在元数据中时,设置“属于”关系

Ruby on rails 当外键存储在元数据中时,设置“属于”关系,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,在Rails 4应用程序中,我有一个STI模型,它将元数据存储在jsonb列中 基类: class Post < ActiveRecord::Base ... end 但这似乎不起作用。帮忙 注意:我不一定想使用所属而不是手工编写所需的方法,如def company,但我确实需要一种在列出职位时急于加载公司的方法。如果有一种方法可以在没有关系的情况下快速加载,我洗耳恭听 更新1 我还尝试了以下方法,但似乎也不起作用: class JobPost < Post belongs

在Rails 4应用程序中,我有一个STI模型,它将元数据存储在jsonb列中

基类:

class Post < ActiveRecord::Base
  ...
end
但这似乎不起作用。帮忙

注意:我不一定想使用
所属
而不是手工编写所需的方法,如
def company
,但我确实需要一种在列出职位时急于加载公司的方法。如果有一种方法可以在没有
关系的情况下快速加载,我洗耳恭听

更新1

我还尝试了以下方法,但似乎也不起作用:

class JobPost < Post
  belongs_to :company, foreign_key: "(posts.metadata->>'company_id')::integer".to_sym
end
class jobspost>'company\u id')::integer“
结束
更新2

为了更清楚地了解我的意图和需要:

1) JobPost
属于公司,但Post(以及Post的其他子类)不属于公司。当其他子类不使用
company\u id
列时,我不希望简简单单地将它添加到
posts
表中

2) 一个职位可以证明拥有自己的表格是合理的(也许与公司的关系足以证明这一点)。这并不理想有很多原因,但如果这是唯一的答案,我愿意接受。然而,在走上这条路之前,我希望有一个更明确的回答“你想做的事做不到”

主要的问题是您是否可以自定义
所属的
,以便它使用元数据列,而不是期望外键是表中的一列

第二个问题是,您是否可以在不设置
所属关系的情况下,将公司与职位一起加载。

编辑

UPD 2

您需要将“company_id”列添加到STI表的基类中。如果JobPost继承自Post,并且它应该具有“company\u id”,则将“company\u id”列添加到Post(基表)

记住STI代表“单表继承”,所以在数据库模式级别上只有一个表。设想一个Post表的列,其中很少有数据记录是具有company_id的公司的外键条目,那么该列中具有非JobPost子类类型的其他记录又如何,它们是否为null/empty?因此,关系是用父STI表定义的,子类继承这些关系。STI中的附加类型列定义了子类类型

检查

如果JobPost和Post都与公司有关系,您可能需要进一步挖掘而不是STI,否则创建两个单独的模型,因为它们往往有一些独特的关系和列字段

UPD

基于更新的ask

  • app/model/company.rb
  • class公司结束
    您好,感谢您的回复!我真正想要的是在JobPost模型上建立一个
    属于
    公司关系的方法,这样我就可以加载与每个职位相关的公司。Rails文档表明,您可以使用作用域或块来编写
    所属
    的自定义实现,这就是我在这里要做的。如果我只是在控制器中加载所有JobPost记录,然后尝试从那里访问视图中的company对象,那么将导致N+1查询,这是我试图避免的。另外,
    find_by_id
    如果没有结果,则返回nil
    find
    返回一个错误。我已经更新了问题,以便更清楚地了解
    的归属。此外,您的答案似乎表明
    companys
    表应该包含外键,但
    belient\u to
    希望
    posts
    表中包含外键。只需将belient\u添加到:company即可。使用includes避免[N+1]查询
    所属:仅当
    公司id
    作为列存储在
    posts
    表中时,公司才能工作。在我的示例中,它存储在jsonb元数据列中。问题是如何使用作用域/块重写
    所属
    实现,以便它查看元数据内部,而不是期待
    公司id
    列,或者,如何完全避开
    所属
    问题。创建工单的一种方法是从散列参数jobspost.create(公司id:params[:company_id],其他_键:值),您可以将其作为作用域编写,也可以在创建之前编写,使用“属于”to relation,您可以通过公司id与JobPost关联,并且您可以在公司实例上使用JobPost作为链方法。我不理解您的问题,因为您的问题比它复杂得多。您想要一个带有JobPost子类的Post STI模型吗?此Post类是否属于C类公司classA Post不属于公司,但JobPost属于公司。
    posts
    表没有
    公司id
    列,因此不能使用
    属于:Company
    posts
    表有
    元数据
    列。JobPost使用该
    元数据
    列存储
    公司任何_id
    。但是,如果将
    所属_to:company
    添加到JobPost类中,您将得到一个未定义的列错误。问题是是否可以编写自己的
    所属
    实现,以便它查看元数据列,而不是依赖表中的
    company\u id
    列。或者,可以u回避这个问题。你能用一个名称索引一个列的20%记录,用另一个列名索引同一列的80%记录吗?不幸的是rails还没有那么聪明。希望它能回答!你可以在STI中继承子类,但它们仍然属于一个表。听起来你可能不熟悉使用元数据c的模式包含STI的列只包含这些记录中每个子类的特定数据
    class JobPost < Post
      belongs_to :company do
        Company.find_by_id self.metadata['company_id']
      end
    end
    
    class JobPost < Post
      belongs_to :company, foreign_key: "(posts.metadata->>'company_id')::integer".to_sym
    end