Ruby on Rails Concern适配Person模型的最优实现方案问询
解决Concern中Person模型无需重复定义.person方法的最优方案
咱们来捋捋你遇到的问题:你写的这个Concern里,unauthorised_items?方法依赖self.person去调用authorised?,但Person模型自己include这个Concern的时候,压根没有person方法——总不能让一个Person关联另一个Person吧?而Bike、House、Garden这些模型因为有belongs_to :person的关联,天然就自带person方法,所以没问题。
最优的解决方案就是让这个Concern自己“智能适配”:只给Person模型补上person方法(返回它自己),其他模型完全不用额外处理,因为它们的关联已经搞定了。具体代码这么写:
# app/models/concerns/your_concern_name.rb module YourConcernName extend ActiveSupport::Concern included do # 专门给Person模型加person方法,直接返回自身 define_method(:person) { self } if self == Person end def unauthorised_items? self.person.authorised? end end
为啥说这个方案好?
- 完全符合DRY原则:不用在Person模型里单独写一遍
person方法,所有逻辑都封装在Concern里,以后要改也只改这一处 - 自动适配无额外操作:Concern会自动判断当前模型是不是Person,是的话就补上方法,其他模型该用自己的关联方法就用,完全不影响
- 代码简洁清晰:一行条件判断就搞定,别人看代码也一眼能明白是啥意思
要是以后你还有其他模型需要特殊处理,也可以在这个included块里加条件扩展,比如某个模型需要返回特定的Person对象,直接加个elsif self == SomeModel就行,扩展性拉满。
内容的提问来源于stack exchange,提问作者David Sigley
相关产品推荐
相关产品推荐

