【问题标题】:PostgreSQL jsonb field in ActiveRecord belongs_to associationActiveRecord belongs_to 关联中的 PostgreSQL jsonb 字段
【发布时间】:2015-10-01 13:46:12
【问题描述】:

我可以在belongs_to 关联中使用jsonb 字段作为foreign_key 吗?大致如下:

belongs_to :product, class_name: "Product",  foreign_key: "data ->'product_id'"

【问题讨论】:

    标签: ruby-on-rails postgresql rails-activerecord


    【解决方案1】:

    只能在列(或列组)之间定义引用,如the documentation 所述:

    FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]

    【讨论】:

    • 老实说,我不明白外键 约束 限制与问题有何关系...是的,这意味着您不能保证引用 完整性,但我不明白这意味着rails 仍然无法建立关系如果 这不是一个问题。没有FOREIGN KEY 约束,SELECT * FROM products INNER JOIN instructions ON products.id = instructions.data->'product_id' 仍然是有效的 SQL,不是吗?
    • @SampsonCrowley - 声明引用了外键。根据the documentation: (...),通过声明一个模型属于另一个模型,您可以指示 Rails 在两个模型的实例之间维护主键-外键信息。
    • 这仍然与数据库本身无关;关键字有两个模型的instances。如果我创建一个包含product_id 列的表,而没有FOREIGN KEYany 形式,则rails 使用该列创建关联和正确的查询没有问题。我想我的意思是您与 PostgreSQL 文档的链接与 rails belongs_to/has_many 配置和创建关联的能力无关,否则多态关联将是不可能的
    • 引用的句子清楚地表明belongs_to是由数据库中的引用(主键-外键)实现的。其他关联可能以不同的方式实现。
    • 不,没有需要在数据库级别维护引用完整性。我可以 100% 保证 ActiveRecord 会进行 zero 检查以查看是否存在外键约束。提问者的代码不起作用的唯一原因是 ActiveRecord 期望密钥是 model 上的 attribute。直接来自您在 cmets 中提供的同一链接:如果您希望在数据库级别强制执行引用完整性,请将 foreign_key: true 选项添加到上面的“引用”列声明中。是否完全可选使列成为实际的外键
    【解决方案2】:

    您可以使用activerecord-json-associations 使用 PostgreSQL JSONB 字段来存储模型的关联信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-12
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多