由于干净的代码原因,我想隐藏主要Model方法中的某些实现。我不希望我的模型包含许多巨大的方法,只有最清晰和冗长的功能。
例如:
class SomeModel
#included stuff
#fields & attrs
def modelMethod
variable = functionality1(functionality2)
if some condition
functionality3
else
functionality4
end
end
我应该将我的功能方法放在同一模型文件末尾的private
或protected
部分下,还是应该将它们放入帮助文件中?
如果我没错,帮助程序中的代码仅用于View。这个的惯例是什么?
答案 0 :(得分:4)
让private
或protected
与您尝试执行的清理类型无关。
这与继承方法可见性/访问有关(尽管继承显然可以用于可重用性)。
方法取决于可重用性。为什么不利用顾虑?假设我们有SomeModel
并希望有多个模型来实现暂停。
# app/models/some_model.rb
class SomeModel
include Suspendable
end
然后添加您的模型问题。
# app/models/concerns/suspendable.rb
module Suspendable
extend ActiveSupport::Concern
included do
has_one :suspension
scope :active, -> { joins('LEFT OUTER JOIN suspensions').where(suspension: {id: nil} }
end
end
或者如果这只是真的适用于单个模型,但是想要保持模型严格的数据库操作(不是面向业务),那么你可能会有命名空间问题。
# app/models/concerns/some_model/availability.rb
module SomeModel::Availability
extend ActiveSupport::Concern
module ClassMethods
def availabilities_by_some_logic
end
end
end
http://api.rubyonrails.org/v5.0/classes/ActiveSupport/Concern.html
答案 1 :(得分:1)
如果您有各种模型中使用的方法或方法集: Rails Concerns
这与private / protected不同,您可以关注私有/受保护的方法。这就是如何提取重复。
如果您拥有模型所需的方法,并且只有模型(不是模型的子类,并且从未在类外部调用过:
private
如果您拥有模型及其子类所需的方法,但不是来自模型外部的方法:
protected
如果您需要能够从课外调用该方法: 既不
this answer详细介绍了