模型方法总是会返回自己类型的模型吗?

时间:2011-06-28 13:53:28

标签: ruby-on-rails activerecord model

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

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

如果您的Theater has_many Showtimes,则可以Theater.Showtimes访问它。

答案 2 :(得分:1)

实现示例(Theater.get_showtimes(theater_id))的几种ActiveRecord风格方式是:

  • Theater.find(theater_id).showtimes代替。这假设您已将ActiveRecord关联用作zsalzbank提及。
  • 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而破坏了规则,并且无论如何都必须处理不同的返回类。 / p>

答案 3 :(得分:0)

简答:不。

模型只是一个ruby类文件,它代表数据库中的某个表,实际上只用于ruby-on-rails世界。模型不会返回任何内容,它只是一个容器。模型具有返回数据的方法/函数,绝不必返回相同的模型对象。

例如(伪代码):

class Dog < AR:B

  def hack_the_world
    //do hacking and return array of passwords
    //...
  end

end

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

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

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

passwords=Dog.new.hack_the_world