【问题标题】:Should model methods always return models of their own type?模型方法应该总是返回它们自己类型的模型吗?
【发布时间】:2011-06-28 13:53:27
【问题描述】:

对于返回模型或模型集合的模型方法,这些方法是否应该只返回与其所在类对应的类型的模型?

例如,如果我有一个剧院模型,它的方法是否应该总是返回剧院类型的模型,或者返回 Showtime 类型的模型是否有意义(例如,Theatre.get_showtimes(theater_id) 与 Showtimes.get_by_theater_id(剧院 ID))。

【问题讨论】:

    标签: ruby-on-rails activerecord model


    【解决方案1】:

    几乎每次遇到像你这样的情况时,我都会问自己这个问题。我个人尝试坚持使用返回自己类型的模型。所以在那种情况下,我会选择Showtimes.get_by_theater_id(theater_id)。当我稍后查看代码时,它会更有意义。

    【讨论】:

      【解决方案2】:

      如果你的Theaterhas_manyShowtimes,那么你可以通过Theater.Showtimes访问它。

      【讨论】:

      • 对,但我在这里说的是理论。
      【解决方案3】:

      实现您的示例 (Theater.get_showtimes(theater_id)) 的更多 ActiveRecord 风格的方法是:

      • Theater.find(theater_id).showtimes 代替。这假设您已经使用了 zsalzbank 提到的 ActiveRecord 关联。
      • Showtimes.find_by_theater_id(theater_id)

      我建议您将 ActiveRecord 的强大功能用于其最擅长的事情,而不必担心人为地将自己限制为可能返回的类方法。

      现在,如果我们谈论的是纯理论,我会主张遵循您所使用的语言和/或框架的约定。

      查看ActiveRecord::Base (http://apidock.com/rails/ActiveRecord/Base) 很容易找到一堆返回非ActiveRecord::Base 的类方法。例如,ActiveRecord::Base.connection 返回ActiveRecord::ConnectionAdapters::AbstractAdapter 的子类,ActiveRecord::Base.table_name 返回String。显然,您的模型也有这些方法,因此它会返回这些值。

      我认为对您自己/您的代码设置建议的限制没有任何好处 - 特别是因为您已经通过从 ActiveRecord::Base 继承而违反了规则,并且无论如何都必须处理不同的返回类。

      【讨论】:

      • 没错,但我在这里说的是理论。我的例子不是最好的,但我确信在某些情况下会出现给定方法是否属于给定模型的问题。
      • 更新了答案,并对理论有一些看法。虽然我认为我们可能会在这次讨论中超出 Stack Overflow 范围?
      • 你会建议在哪里进行讨论?
      • 我不知道,programmers.stackexchange.com 可能。在我看来,这个问题“可能会征求意见、辩论、争论、投票或扩展讨论”。我不在乎,只是说你在其他地方可能会有更好的运气。
      【解决方案4】:

      简短回答:不。

      模型只是一个 ruby​​ 类文件,它代表数据库中的某个表,并且实际上仅在 ruby​​-on-rails 世界中使用。模型不返回任何东西,它只是一个容器。模型具有返回数据的方法/函数,它们不必只返回相同的模型对象。

      例如(伪代码):

      class Dog < AR:B
      
        def hack_the_world
          //do hacking and return array of passwords
          //...
        end
      
      end
      

      我们这里有一个 Dog 模型。例如,我们从返回 Dog 对象的 rails 获取这些方法:

      dogs=Dog.all
      dog=Dog.find(1)
      dog=Dog.where(:name => 'fido')
      

      但是我们可以调用不返回任何 Dog 对象的方法

      passwords=Dog.new.hack_the_world
      

      【讨论】:

      • 没有混淆。我已将措辞更新为:“应该 其方法 总是返回”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      • 2015-07-20
      相关资源
      最近更新 更多