ruby 多态关联Rails:不同的primary_keys类型(id & uuid)

ukdjmx9f  于 12个月前  发布在  Ruby
关注(0)|答案(4)|浏览(85)

我想定义一个多态表。我的问题是一个表的primary_key是uuid(string)类型,而另一个是id(integer)类型。我想也许有一个model_able_id和一个model_able_uuid根据model_type而变化,但我不能弄清楚,它可能会打破多态的activerecord功能吨。
我想到的其他一些事情是使用STI,但我仍然感到困惑,当然,我可以将id迁移到uuid,这会解决我的问题(但我宁愿不要)。

ltskdhd1

ltskdhd11#

在选项中指定(多态)外键的类型。如果需要,将:string更改为:uuid

create_table :table_name do |t|
  t.references :target, type: :string, polymorphic: true, null: false
end

那么字符串和整数target_id s都是可以接受的。
查看API文档。

bnl4lu3b

bnl4lu3b2#

面临着同样的问题,还没有官方的解决方案,这两个问题在rails repo中公开:
https://github.com/rails/rails/issues/33407
https://github.com/rails/rails/issues/33525
在其中一个问题中有一个建议,它对我不起作用(它生成了两个连接,一个是由rails生成的默认连接,这会导致失败,另一个是我定义的)。
最后我根本没有使用关联,我定义了一个方法来使用自定义查询正确地获取实际记录。我不需要dependent: destroy,否则我也可以定义一个before_destroy方法。
希望它能帮助某人。

qvsjd97n

qvsjd97n3#

我也有同样的问题。我的解决方案将_id字段的类型修改为string。

def change
  add_reference :ratings, :rater, polymorphic: true, index: true
  change_column :ratings, :rater_id, :string
end

我希望能帮上忙。

vptzau2j

vptzau2j4#

一种方法是使用多个多态类,它们具有相同的目的,一个用于id,一个用于字符串。我将用这个Commentable问题来演示。

# bigint id migration
create_table :comments do |t|
  t.references :commentable, polymorphic: true, null: true
  ...
end

# string id migration
create_table :string_id_comments do |t|
  t.references :commentable, type: :string, polymorphic: true, null: true
  ...
end

定义StringIdCommentsComments的模型。它们可以通过关注点或扩展来共享代码。Commentable关注点现在需要决定使用哪一个:用途:

module Commentable
  extend ActiveSupport::Concern
  included do
    if columns_hash[primary_key].type == :integer
      has_many :comments, as: :commentable, dependent: :destroy
    else
      has_many :comments, as: :commentable, class_name: 'StringIdComments', dependent: :destroy
    end
  end
end

如果您希望通过Comment进行查询,那么这有两个表的缺点,可以通过将这些表用作实际注解来消除。我还没有测试过,但也可以通过在一个多态类中设置两个键(一个string和一个bigint)并在has_中指定键来解决。

相关问题