【问题标题】:Rails: Check associated belongs_to object type in a polymorphic relationRails:检查多态关系中关联的belongs_to对象类型
【发布时间】:2021-10-26 18:32:31
【问题描述】:

我有三个模型:

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 在这种情况下引发错误?

【问题讨论】:

  • 这个问题没有意义。如果您有指向membershipstickets 的外键列,多态关联甚至应该完成什么?通过“确保 Rails 引发错误”,您是要引发异常还是添加验证错误?
  • 是多态@max,答案如下。

标签: ruby-on-rails polymorphic-associations


【解决方案1】:

您可能应该看一下this post,其中引用了一些解决此问题的方法。 或许this post 也能帮到你。

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

  • 在 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
    
  • 在 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
    

【讨论】:

  • 完美,这完全有道理。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多