首页 > 解决方案 > 与条件的多态关联

问题描述

我们有以下型号...

class Post
  has_many: :comments, as: :commentable
end

class Media
  has_many: :comments, as: :commentable
end

class Comment
  belongs_to: :commentable, polymorphic: true
  belongs_to: :post, foreign_key::post_id, foreign_type: 'Post'
end

示例

Post1 has Comment3 => {id: 3, text: "Some comment 3", commentable_id: 1, commentable_type: 'Post'}
Media2 has Comment4 => {id: 4, text: "Some comment 4", commentable_id: 2, commentable_type: 'Media'}

When I want to access Comment3.post it gives result as expected.
But When some how want access Comment4.post it brings an object from post table which has id = 2, but expected nil, coz Comment4 does not belongs to any post.

我们可以从 Comment 模型中的以下方法获取,但希望作为关联。

def post
  self.commentable if self.commentable_type == 'Post'
end

无法达到我的预期..,请在此处提供帮助...

标签: ruby-on-rails-4associations

解决方案


我喜欢你的方法

def post
  self.commentable if self.commentable_type == 'Post'
end

但是如果你真的需要关联方式,那么你可以试试

belongs_to :post, foreign_key: :commentable_id, foreign_type: :commentable_type, polymorphic: true

或者

belongs_to :post, -> (record){ record.commentable_type == 'Post' ? joins(:comments).where(comments: {commentable_type: 'Post'}) : where("false") }, foreign_key: :commentable_id

希望能帮助到你。


推荐阅读