使用外键作为组合键的一部分

时间:2019-11-04 22:04:35

标签: ruby-on-rails ruby activerecord

因此,我正在创建类似于Google Analytics(分析)的应用。用户在他的博客上安装了摘录的JS,并且JS发送与每个帖子相关的指标。安装它所需的唯一额外信息就是他的site_id(有点像Google Analytics(分析)ID)。该应用仅适用于wordpress,并且将为每个博客帖子创建posts表中的一个条目,因此我进行了以下迁移:

class CreatePosts < ActiveRecord::Migration[6.0]
  def change
   create_table :posts, primary_key: %i[id site_id] do |t|
      t.belongs_to :site, null: false
      t.bigint :id
      t.bigint :post_id
      t.string :url

      t.timestamps
    end
  end
end

我创建了这个复合键,外键(site_id)是其中的一部分。我想知道是否可以,是否会破坏ActiveRecord的任何方面。

我知道这看起来很奇怪,所以让我解释为什么我需要这个。

帖子的id将与wordpress博客帖子数据库中使用的ID相同,因此,假设我有两个用户,每个用户有一个站点,每个用户包含5个帖子。如果他们的博客帖子包含相同的id,这将是一个问题...但是,如果我有复合键site_id + post_id可以。我唯一关心的是,这是否会破坏ActiveRecord处理关联的方式。

我正在进行一些测试,并且一切似乎都可以正常运行,但是我不确定,因为尽管创建了帖子,但此警告不断出现:

WARNING: Active Record does not support composite primary key.

posts has composite primary key. Composite primary key is ignored.

谢谢。

1 个答案:

答案 0 :(得分:2)

因此,Rails ActiveRecord默认情况下不支持复合主键。这就是您将看到此消息(here is the source

的原因

但是,如果您想使用此功能,可以尝试使用composite_primary_keys gem

所以您可以做类似

的操作
# after installing the gem
class Post < ActiveRecord::Base
  self.primary_keys = :id, site_id
  ...
end