我可以在belongs_to关联中使用jsonb字段作为foreign_key吗?
belongs_to :product, class_name: "Product", foreign_key: "data ->'product_id'"
字符串
5vf7fwbs1#
引用只能在列(或列组)之间定义,如the documentation中所述:FOREIGN KEY(column_name [,... ])REFERENCES reftable [(refcolumn [,... ])]
uurity8g2#
您可以使用activerecord-json-associations来使用PostgreSQL JSONB字段来存储模型的关联信息
jqjz2hbq3#
正如在@klin给answer的评论中所讨论的那样,不可能在ActiveRecord中开箱即用。然而,我想出了一个更好的可维护方法,在我的项目中类似的情况下。我正在利用一个数据库特性(如果你能控制底层数据库的话)--生成列或者虚拟列非常适合这个任务
ALTER TABLE orders ADD COLUMN product_id BIGINT GENERATED ALWAYS AS (CAST(data->>'product_id' AS BIGINT)) STORED; CREATE INDEX IF NOT EXISTS "index_orders_on_product_id" ON "cq_shopify"."orders" ("product_id");
字符串现在,您正在让DB做它最擅长的事情-存储数据并运行存储的过程以维护数据完整性。既然你现在有了一个名为product_id的虚拟或生成字段,你可以在Rails应用中使用普通的belongs_to :products要将其保留在项目中-只需将其作为迁移添加到代码中。
product_id
belongs_to :products
3条答案
按热度按时间5vf7fwbs1#
引用只能在列(或列组)之间定义,如the documentation中所述:
FOREIGN KEY(column_name [,... ])REFERENCES reftable [(refcolumn [,... ])]
uurity8g2#
您可以使用activerecord-json-associations来使用PostgreSQL JSONB字段来存储模型的关联信息
jqjz2hbq3#
正如在@klin给answer的评论中所讨论的那样,不可能在ActiveRecord中开箱即用。
然而,我想出了一个更好的可维护方法,在我的项目中类似的情况下。
我正在利用一个数据库特性(如果你能控制底层数据库的话)--生成列或者虚拟列非常适合这个任务
字符串
现在,您正在让DB做它最擅长的事情-存储数据并运行存储的过程以维护数据完整性。
既然你现在有了一个名为
product_id
的虚拟或生成字段,你可以在Rails应用中使用普通的belongs_to :products
要将其保留在项目中-只需将其作为迁移添加到代码中。