首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证多态关联的引用完整性

问验证多态关联的引用完整性
EN

Stack Overflow用户
提问于 2015-08-15 13:35:20
回答 1查看 436关注 0票数 1

在Rails应用程序中工作,我将一个可选的belongs_to关联更改为多态。现有代码正在验证关联的引用完整性,我正在设法将其转换为多态成语。

一个简单但有说明性的例子..。

老的:

代码语言:javascript
复制
class Climb < ActiveRecord::Base

  belongs_to :ladder
  validate   :ladder_exists_if_id_set

  def ladder_exists_if_id_set
    if ladder_id.present? && Ladder.find_by_id(ladder_id).blank?
      errors.add('Ladder id', 'invalid. Set a different ladder id or nil.')
    end
  end

end

新的:

代码语言:javascript
复制
class Climb < ActiveRecord::Base

  belongs_to :climbable, polymorphic: true
  validate   :climbable_exists_if_set

  def climbable_exists_if_set
    return unless climbable_id.present? && climbable_type.present?

    klass = climbable_type.constantize

    if klass.find_by_id(climbable_id).blank?
      errors.add("#{klass} id", "invalid. Set a different #{klass} id or nil.")
    end
  end

end

这似乎可行,但这是正确的方法吗?似乎我正在重新实现多态提供的动态getter/setter方法。

Sidenote:我可以忽略只设置_type或_id的情况,因为在这种情况下Rails使记录无效。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-16 02:04:46

我想知道,为什么在原来的代码中以这种方式验证id的唯一性?如果需要的话,编写validates :ladder_id, uniqueness: true, allow_nil: true [, allow_blank: true] (you should decide what you want to allow)和使用自定义消息不是更容易吗?然后查看Rails是否在新代码中为您处理多态关联。我想你不需要你的climbable_exists_if_set。

在您的评论之后,

这可能更容易。你只需要验证梯子物体的存在。注意,不是ladder_id,而是对象本身,所以您的验证应该如下所示:

代码语言:javascript
复制
validates :ladder, presence: true, allow_nil: true [, allow_blank: true]

在本例中,rails验证梯子表中是否存在具有给定id的实际梯子记录。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32025257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档