Rails 多态关联:限制允许的类

Rails polymorphic association: Restrict allowed classes

提问人:rubykatz 提问时间:11/19/2016 最后编辑:Nikita Fedyashevrubykatz 更新时间:11/17/2023 访问量:4101

问:

我想要一个类通过多态关联到其他类。belong_to

将关联限制为特定类列表的最佳方法是什么?

我正在考虑使用这样的自定义验证方法,但我不知道这是否真的是最好的主意:

class Feature < ActiveRecord::Base
  belongs_to :featureable, polymorphic: true

  validate :featurable_is_of_allowed_class

  FEATURABLE_CLASSES = ["Country", "City", "Store", "Product"]

  def featurable_is_of_allowed_class
    if !FEATURABLE_CLASSES.include? featurable.class.name
      errors.add(:featurable, "class not allowed for association")
    end
  end
end
Ruby-on-Rails 验证 ActiveRecord 多态关联

评论

0赞 Edmund Lee 11/19/2016
如果您期望该类在另一个类出现错误或某种排序时抛出错误,则不可能。has_many :features

答:

28赞 Mark 3/23/2017 #1

我们对多态类型使用了此验证 (Rails 5):

ALLOWED_TYPES = %w(Star Planet).freeze

validates :moonable_type, inclusion: { in: ALLOWED_TYPES }

评论

3赞 Pere Joan Martorell 3/4/2019
validates :moonable_id, presence: true, numericality: { only_integer: true }不是必需的,因为 Rails 已经检查了可移动记录是否存在。
0赞 Mark 4/28/2020
@PereJoanMartorell 谢谢你让我知道!
0赞 unflores 6/16/2021
呵呵,关于如何允许 NIL 的想法?我想你会为此进行自定义验证吗?
1赞 Jorge Arimitsu 11/21/2021
@unflores,您可以使用allow_nil选项。例如:Rails 指南validates :size, inclusion: { in: ALLOWED_TYPES }, allow_nil: true
0赞 Nicolas E. 11/17/2023 #2

不久前,我实现了这个宝石 SafePolymorphic

只使用 a 的好处是它更简洁、更易于阅读,并且您可以获得一些帮助程序,例如范围。validates

class Feature < ActiveRecord::Base
    belongs_to :featureable, polymorphic: [Country, City, Store, Product]
end