加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails:使用具有相似复杂属性的ActiveRecord模

发布时间:2020-12-17 03:33:59 所属栏目:百科 来源:网络整理
导读:这似乎应该有一个简单的答案,但在Google和SO上经过很长时间后我找不到它.这可能是错过正确关键字的情况. 在我的RoR应用程序中,我有几个共享特定类型的字符串属性的模型,它具有特殊的验证和其他功能.我能想到的最接近的类似示例是表示URL的字符串. 这导致了模
这似乎应该有一个简单的答案,但在Google和SO上经过很长时间后我找不到它.这可能是错过正确关键字的情况.

在我的RoR应用程序中,我有几个共享特定类型的字符串属性的模型,它具有特殊的验证和其他功能.我能想到的最接近的类似示例是表示URL的字符串.

这导致了模型中的大量重复(甚至在单元测试中更多重复),但我不确定如何使其更加干燥.

我可以想到几个可能的方向……

>沿着线创建一个插件
“validates_url_format_of”插件,
但这只会使
验证DRY
>给这个特殊字符串自己的模型,但这似乎非常
重的解决方案
>为这个特殊的字符串创建一个ruby类,但我该怎么做
ActiveRecord关联此类
使用的模型属性是
db中的字符串

3号似乎是最合理的,但我无法弄清楚如何扩展ActiveRecord来处理除基本数据类型之外的任何东西.有什么指针吗?

最后,如果有办法做到这一点,那么在文件夹层次结构中你会把新类放在不是模型的位置?

非常感谢.

更新:

下面使用Matt的mixin建议的一个潜在解决方案(并使用URL示例).注意,这比真正的ruby更接近伪代码,并且旨在传达原理而不是完美的语法.

首先,创建一个url mixin:

module Url
  def url_well_formed?
    [...]
  end

  def url_live?
    [...]
  end
end

在站点模型中,包括此模块:

Class Site < ActiveRecord:Base
  include Url

  validate :url_well_formed?
end

当我需要检查URL上的网站是否有效时,请…

if site.url_live?
  [...]
end

这个问题没有解决的问题是如何让单元测试DRY.如果我有另一个使用Url mixin的模型,比如Page,它仍然需要一组重复的URL单元测试.当然,我可以将它们放在帮助器中,但这看起来很混乱.

有没有更基本的解决方案,还是这样的解决方案?

解决方法

创建一个抽象模型:

class CommonBase < ActiveRecord::Base
  self.abstract_class = true # makes the model abstract
  validate_format_of :url_field,:with => /.../
end

从抽象模型继承模型:

class User < CommonBase
end

class Post < CommonBase
end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读