多态关联
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.rb
和 Topic.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"
我希望这会对某人有所帮助!感谢评论!
我有模型评论和主题。我想创建另一个名为 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.rb
和 Topic.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"
我希望这会对某人有所帮助!感谢评论!