首页 文章

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

提问于
浏览
1

我想隐藏主要Model方法中的某些实现,因为代码清晰 . 我不希望我的模型包含许多巨大的方法,只有最清晰和冗长的功能 .

例如:

class SomeModel
  #included stuff
  #fields & attrs

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

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

如果我是对的,帮助程序中的代码仅用于View . 这有什么约定?

2 回答

  • 4

    privateprotected 与您尝试进行的清理类型无关 .

    这与继承方法可见性/访问有关(尽管继承显然可以用于可重用性) .

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

    如果您有各种模型中使用的方法或方法集:Rails Concerns

    这与private / protected不同,您可以关注私有/受保护的方法 . 这就是如何提取重复 .

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

    如果您有一个模型及其子类所需的方法,但不是来自模型外部的方法: protected

    如果你需要能够从课外调用该方法:既不是

    this answer详细介绍了这些内容

相关问题