我有ActiveRecord find
的猴子补丁,其中包含一些业务逻辑,例如:
# lib/core_extensions/active_record/finder_methods/finder.rb
module ActiveRecord
module FinderMethods
def find(*args)
return super if block_given?
#... business logic code => my_error_control = true
raise "My Error" if my_error_control
retorn = find_with_ids(*args)
end
end
end
retorn
我还没有看到很多这样的例子,这使我产生了疑问:
finder.rb
应该在哪里?
在此示例中,此文件位于lib/core_extensions/...
中,但是如果它包含业务逻辑,我认为finder.rb
应该位于文件夹app/core_extensions/
中不是吗?
在Sergio回答后编辑
这样的事情,是不好的做法吗?
# lib/core_extensions/nil_class/image_attributes.rb
# suport for product images attributes
class NilClass
def main_image(size,evita_video)
"/images/paperclip_missing/original/missing.png"
end
end
答案 0 :(得分:2)
这是我第一次看到这样的情况:)。我将其放在app/core_extensions
中,并检查实时重载是否可以正常使用。如果没有,我将其移至lib/
。 (这只是一种启发)
编辑:
我宁愿使用常规的NullObjects而不是扩展NilClass
。确实不那么令人惊讶,更容易理解。
https://robots.thoughtbot.com/rails-refactoring-example-introduce-null-object
答案 1 :(得分:2)
finder.rb应该在哪里?
最终,没关系。只需加载此代码就很重要。修补基础库和添加业务逻辑的这种混合看起来必须被彻底记录(在项目的Wiki或类似的东西中)。如果有文档记录,那就没关系。代码就是文档所说的地方。
不建议使用,这是一个设计建议:
当用户寻找家族
的公司。Family.find(params[family_id],session[:company_id])
时,此发现将比较家族结果family.company与参数
为什么不做这样的事情:
family = current_company.families.find(params[:family_id])
其中current_company可以定义为@current_company ||= Company.find(session[:company_id])
在这里,如果这家公司没有这个家族,您会遇到一个例外。
相同效果*,仅不进行任何修补。更具前瞻性。您甚至可以添加几个rubocop规则,以确保您永远不会写裸Family.find
。
*并非像您添加该补丁那样,其余代码都神奇地获得了超能力。否。您仍然必须更改所有查找者,以传递该公司ID。