一个模型中有多个相同类型的多态关系-MongoID



我不知道如何正确使用标题,所以让我来解释一下。

我有我的课喜欢:

class Like
  include Mongoid::Document
  belongs_to :likable, polymorphic: true
  belongs_to :user
end
class Submission
  include Mongoid::Document
  belongs_to :creator, class_name: 'User', inverse_of: :submissions
  has_many :likes, :as => :likable, :dependent => :destroy
end

然后是导致问题的类:

class User
  include Mongoid::Document
  has_many :submissions, :dependent => :destroy
  has_many :liked_submissions, :as => :likable, :dependent => :destroy, class_name: 'Like'
  has_many :liked_comments, :as => :likable, :dependent => :destroy, class_name: 'Like'
end

现在的问题是,我不知道如何在用户类中同时拥有"liked_comments"one_answers"liked_comments"。当我像上面那样使用它时,我在尝试为提交创建一个赞时会得到错误:Ambiguous relations :liked_submissions, :liked_comments defined on User.

我环顾四周,发现了一个Github问题,上面说这可能不可能,但我再也找不到这个问题了,我甚至不确定它是否与这个问题有关。

这有可能吗?如果没有,有什么建议可以绕过它吗?我也想在BlogPost模型中使用点赞,但如果这不起作用,我必须找到另一种方法。

提前谢谢。

我试过了,它使用mongoid 4.0.2:版本

class Like
  include Mongoid::Document
  belongs_to :likable, polymorphic: true
  belongs_to :user, inverse_of: :user
end
class Submission
  include Mongoid::Document
  belongs_to :creator, class_name: 'User', inverse_of: :submissions
  has_many :likes, as: :likable, dependent: :destroy
end
class User
  include Mongoid::Document
  has_many :submissions, dependent: :destroy
  has_many :likes, as: :user
  has_many :liked_submissions, as: :likable, dependent: :destroy, class_name: 'Like'
  has_many :liked_comments, as: :likable, dependent: :destroy, class_name: 'Like'
end
class BlogPost
  include Mongoid::Document
  has_many :likes, as: :likable, dependent: :destroy
end

此外,user.liked_submissionsuser.liked_comments是相同的关系,因此它相当于声明一个别名,如下所示:

class User
  include Mongoid::Document
  has_many :submissions, dependent: :destroy
  has_many :likes, as: :user
  has_many :liked_submissions, as: :likable, dependent: :destroy, class_name: 'Like'
  alias :liked_comments :liked_submissions
end

发现这个问题后遇到了困难,但得到了很酷的解决方案,可以

添加到您的Gemfile

宝石多晶型

这就像一种魅力:

  class Resource
  has_one :icon, as: :assetable, class_name: 'Asset', dependent: :destroy, autosave: true
  has_one :preview, as: :assetable, class_name: 'Asset', dependent: :destroy, autosave: true
  end

最新更新