多态关联

Polymorphic assosiation

我有模型评论和主题。我想创建另一个名为 Storage 的模型。 所以现在我在 Storage.rb:

中有了这个
  with_options inverse_of: :storage do
    has_many :comments, as: :editable
    has_many :topics, as: :editable
  end

迁移:

  t.references :editable, polymorphic: true
  t.timestamps

存储空间table:

    t.string "editable_type", null: false
    t.bigint "editable_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["editable_type", "editable_id"], name: "index_storages_on_editable_type_and_editable_id"

Comment.rb:

belongs_to :editable, polymorphic: true, optional: true

Topic.rb:

belongs_to :editable, polymorphic: true, optional: true

我尝试使用多态关联的全部原因是我应该可以从存储中获取 Comment 对象。就像 Comment 以某种方式进入存储一样,我应该能够做一些事情 Storage.particular_comment.user_id 并获取写此评论的用户的 ID。

但是,我无法这样做。我想我的关联中某处有错误,但我只是没有 see/understand 它。谢谢!

我设法解决了这个问题。事实证明,我的主要错误是我没有正确理解这些关联。以最少的查询和努力做到这一点的正确方法如下:

Storage.rb:

  belongs_to :editable, optional: true, inverse_of: :storages, polymorphic: true
  belongs_to :topic, inverse_of: :storages, optional: true
  belongs_to :comment, inverse_of: :storages, optional: true

Comment.rbTopic.rb:

has_many :storages, as: :editable, inverse_of: :comment, dependent: :nullify

has_many :storages, as: :editable, inverse_of: :topic, dependent: :nullify

存储 table 保持不变。

上述协会实现了以下结果:

> c = Comment.last
> st = Storage.create!(:editable => c)
> st
=> #<Storage:0x007fb45d8fcb40> {
             id: 1,
  editable_type: "Comment",
    editable_id: 9,
     created_at: Thu, 11 Feb 2021 05:45:10 EST -05:00,
     updated_at: Thu, 11 Feb 2021 05:45:10 EST -05:00

现在无需冗长复杂的查询即可轻松获取所需的任何信息:


> st.editable
=> #<Comment:0x0055ddca8eddb8> {
          id: 9,
     user_id: 392,
    topic_id: 1183,
     content: "test",
  created_at: Wed, 10 Feb 2021 11:17:42 EST -05:00,
  updated_at: Wed, 10 Feb 2021 11:17:42 EST -05:00
> st.editable.user_id
=> 392
> st.editable.content
=> "test"

我希望这会对某人有所帮助!感谢评论!