Gre*_*reg 5 ruby activerecord ruby-on-rails dry
这似乎应该有一个简单的答案,但在Google和SO上经过很长时间后我找不到它.这可能是错过正确关键字的情况.
在我的RoR应用程序中,我有几个共享特定类型的字符串属性的模型,它具有特殊的验证和其他功能.我能想到的最接近的类似示例是表示URL的字符串.
这导致了模型中的大量重复(甚至在单元测试中更多重复),但我不确定如何使其更加干燥.
我可以想到几个可能的方向......
3号似乎是最合理的,但我无法弄清楚如何扩展ActiveRecord来处理除基本数据类型之外的任何东西.有什么指针吗?
最后,如果有办法做到这一点,那么在文件夹层次结构中你会把新类放在不是模型的位置?
非常感谢.
更新:
下面使用Matt的mixin建议的一个潜在解决方案(并使用URL示例).注意,这比真正的ruby更接近伪代码,并且旨在传达原理而不是完美的语法.
首先,创建一个urlmixin:
module Url
def url_well_formed?
[...]
end
def url_live?
[...]
end
end
Run Code Online (Sandbox Code Playgroud)
在Site模型中,包括此模块:
Class Site < ActiveRecord:Base
include Url
validate :url_well_formed?
end
Run Code Online (Sandbox Code Playgroud)
当我需要检查URL上的网站是否有效时,请...
if site.url_live?
[...]
end
Run Code Online (Sandbox Code Playgroud)
这个问题没有解决的问题是如何让单元测试DRY.如果我有另一个Page使用Urlmixin的模型,它仍然需要一组重复的URL单元测试.当然,我可以将它们放在帮助器中,但这看起来很混乱.
有没有更基本的解决方案,还是这样的解决方案?
创建一个抽象模型:
class CommonBase < ActiveRecord::Base
self.abstract_class = true # makes the model abstract
validate_format_of :url_field, :with => /.../
end
Run Code Online (Sandbox Code Playgroud)
从抽象模型继承模型:
class User < CommonBase
end
class Post < CommonBase
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1781 次 |
| 最近记录: |