Rails:检查多态关系中关联的belongs_to对象类型



我有三个模型:

class Product
belongs_to :object, polymorphic: true
belongs_to :membership, foreign_key: :object_id
belongs_to :ticket, foreign_key: :object_id
end
class Membership
end
class Ticket
end

假设我有一个product,它有一个相关联的membership。例:我可以做:product.membershipproduct.object

但是在这个例子中我也可以输入product.ticket

我如何确保Rails在这种情况下引发错误?

你可能应该看看这篇文章,其中提到了一些解决这个问题的方法。也许这篇文章也能帮到你。

这些帖子列出的解决方案:

  • On Rails 5.2

    belongs_to :membership, -> { includes(:object).where(products: { object_type: Membership.to_s }) }, foreign_key: :object_id
    belongs_to :ticket, -> { includes(:object).where(products: { object_type: Ticket.to_s }) }, foreign_key: :object_id
    
  • 在Rails 4.2上(但似乎在6.1上被弃用,因为foreign_type不再被允许)

    belongs_to :membership, -> { where(notes: { object_type: :Membership }) }, foreign_key: :object_id, foreign_type: :Membership, optional: true
    
  • On Rails 4.1

    class Product < ActiveRecord::Base
    # The true polymorphic association
    belongs_to :object, polymorphic: true
    # The trick to solve this problem
    has_one :self_ref, :class_name => self, :foreign_key => :id
    has_one :membership, :through => :self_ref, :source => :object, :source_type => Membership
    has_one :ticket, :through => :self_ref, :source => :object, :source_type => Ticket
    

最新更新