对于返回模型或模型集合的模型方法,这些方法是否应仅返回与其所在类相对应的类型模型?
例如,如果我有一个Theater模型,它的方法是否总是返回Theater类型的模型,或者返回Showtime类型的模型是否有意义(例如,Theater.get_showtimes(theater_id)与Showtimes.get_by_theater_id( theater_id))。
答案 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