Rails - 放置模型辅助方法的位置

Rails - where to put model helper methods

出于简洁代码的原因,我想对主要模型方法隐藏某些实现。我不希望我的模型包含很多庞大的方法,只包含最清晰和冗长的功能。

例如:

class SomeModel
  #included stuff
  #fields & attrs

  def modelMethod
      variable = functionality1(functionality2)
      if some condition
        functionality3
      else
        functionality4
      end
  end

我应该将我的功能方法放在同一模型文件末尾的 privateprotected 部分下,还是应该将它们放入辅助文件中?

如果我是对的,助手中的代码仅用于视图。这是什么约定?

如果您有一种方法或一组方法用于各种模型: Rails Concerns

这与 private/protected 不同,您可以在关注点中使用 private/protected 方法。这就是提取重复项的方法。

如果你有一个模型需要的方法,并且只有模型(不是模型的子class,并且从不在class之外调用: private

如果您有模型及其子class需要但模型外部不需要的方法: protected

如果您需要能够从 class 外部调用该方法: 都没有

this answer 更详细地介绍了这些

privateprotected 与您尝试执行的清理类型无关。

这与继承方法有关visibility/access(尽管继承显然可以用于可重用性)。

方法将取决于可重用性。为什么不利用担忧?假设我们有 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