【问题标题】:Inheritance of models in Ruby on RailsRuby on Rails 中模型的继承
【发布时间】:2014-12-09 00:09:52
【问题描述】:

我有 2 个或更多模型有一个共同的方法,称为 CapitalizeEachWord。

我可以访问ActiveRecord::Base 类并将方法粘贴到里面吗?或者创建一个名为Application 的模型直接继承ActiveRecord::Base,然后从它继承BreakPointBusCompany

       class BreakPoint < ActiveRecord::Base
          attr_accessible :city,:province_id,:province
          belongs_to :province
          before_save :capitalizeEachWord
          validates :city, presence: true,
                           uniqueness: true,
                           format: /^([[:alpha:]]+\s?){1,}$/
          def capitalizeEachWord
           self.city=self.city.downcase.split.map(&:capitalize).join(' ')
          end              
        end

       class BusCompany < ActiveRecord::Base
         attr_accessible :company
         has_many :bus_set_types 
         validates :company, presence: true, 
                      uniqueness: true,
                      format:  /^([[:alpha:]]+\s?){1,}$/

         def capitalizeEachWord
           self.name=self.name.downcase.split.map(&:capitalize).join(' ')
         end
       end

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2


    【解决方案1】:

    我认为这项工作的最佳方式与您的第二个想法非常相似。

    创建一个ApplicationModel &lt; ActiveRecord::Base 并在其中添加任何共享逻辑。

    使用这种方法,您的其他模型将看起来像这样 (OauthProvider &lt; ApplicationModel) 并包含您放入 ApplicationModel 的任何功能。

    【讨论】:

      【解决方案2】:

      我建议你的第二个选择。

      (更高级的选项是将其存储在 AR 派生类之外,因为它更普遍适用,但在这种情况下可能会花费太多精力。如果需要,您可以随时提取它。 )

      【讨论】:

        【解决方案3】:

        你不能修改 ActiveRecord::Base 没有一些重大的黑客努力。

        您可能正在寻找的是装饰器。装饰器是一种常见的设计模式,它允许您动态地向对象添加功能,而无需创建静态子类。

        这个代码气候博客让您知道如何在 Rails 中做到这一点:Refactoring Fat Models

        如果您对使用普通 Ruby 的其他方式(例如模块和 mixins)感兴趣,请查看这篇 ThoughtBot 文章。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-12-20
          • 1970-01-01
          • 2014-03-15
          • 1970-01-01
          • 1970-01-01
          • 2020-04-23
          • 2015-10-24
          相关资源
          最近更新 更多