由于干净的代码原因,我想将某些实现隐藏在主Model方法中。我不希望我的模型包含许多巨大的方法,只包含最清晰和详细的功能。
例如:
class SomeModel
#included stuff
#fields & attrs
def modelMethod
variable = functionality1(functionality2)
if some condition
functionality3
else
functionality4
end
end我应该将我的功能方法放在同一个模型文件末尾的private或protected部件下,还是应该将它们放入助手文件中?
如果我是对的,助手中的代码只用于视图。这是什么惯例?
发布于 2017-06-07 14:41:51
拥有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或者,如果这只适用于单个模型,但希望严格保留模型的DB操作(而不是面向业务的),那么您可以使用名称空间的关注。
# app/models/concerns/some_model/availability.rb
module SomeModel::Availability
extend ActiveSupport::Concern
module ClassMethods
def availabilities_by_some_logic
end
end
endhttp://api.rubyonrails.org/v5.0/classes/ActiveSupport/Concern.html
发布于 2017-06-07 14:40:50
如果您有在各种模型中使用的方法或一组方法:Rails关注
这与私有/受保护不同,您可以使用私有/受保护的方法。这就是如何提取复制。
如果您有一个模型需要的方法,并且只有模型(不是模型的子类),并且从未在类外部调用:private
如果您有一个模型及其子类需要的方法,而不是来自模型外部的方法:protected
如果您需要能够从类外部调用该方法,则两者都不能。
这个答案更详细地介绍了这些
https://stackoverflow.com/questions/44415618
复制相似问题