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
4条答案
按热度按时间ltskdhd11#
在选项中指定(多态)外键的类型。如果需要,将
:string
更改为:uuid
。那么字符串和整数
target_id
s都是可以接受的。查看API文档。
bnl4lu3b2#
面临着同样的问题,还没有官方的解决方案,这两个问题在rails repo中公开:
https://github.com/rails/rails/issues/33407
https://github.com/rails/rails/issues/33525
在其中一个问题中有一个建议,它对我不起作用(它生成了两个连接,一个是由rails生成的默认连接,这会导致失败,另一个是我定义的)。
最后我根本没有使用关联,我定义了一个方法来使用自定义查询正确地获取实际记录。我不需要
dependent: destroy
,否则我也可以定义一个before_destroy方法。希望它能帮助某人。
qvsjd97n3#
我也有同样的问题。我的解决方案将
_id
字段的类型修改为string。我希望能帮上忙。
vptzau2j4#
一种方法是使用多个多态类,它们具有相同的目的,一个用于id,一个用于字符串。我将用这个
Commentable
问题来演示。定义
StringIdComments
和Comments
的模型。它们可以通过关注点或扩展来共享代码。Commentable
关注点现在需要决定使用哪一个:用途:如果您希望通过
Comment
进行查询,那么这有两个表的缺点,可以通过将这些表用作实际注解来消除。我还没有测试过,但也可以通过在一个多态类中设置两个键(一个string和一个bigint)并在has_
中指定键来解决。