2011-06-28 46 views
1

对于返回模型或模型集合的模型方法,这些方法应该只返回与它们所在类相对应的类型的模型吗?例如,如果我有一个Theater模型,它的方法是否应该总是返回类型为Theater的模型,或者它是否有意义返回类型为Showtime的模型(例如,Theater.get_showtimes(theater_id)与Showtimes.get_by_theater_id (theater_id))。模型方法应该总是返回自己类型的模型吗?

回答

1

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

+0

没错,但我在这里讲理论。 –

2

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

0

简答:没有。

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

例如(伪代码):

class Dog < AR:B 

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

end 

我们这里有一个狗模型。比如我们从这些轨方法,返回狗对象:

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

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

passwords=Dog.new.hack_the_world 
+0

不会混淆。我已更新措辞为:“应该*其方法*总是返回” –

1

一对夫妇的更多的ActiveRecord式的方式实施你的例子(Theater.get_showtimes(theater_id))将是:

  • 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继承的规则,并且不得不处理不同的返回类。

+0

是的,但我在这里讲理论。我的例子并不是最好的,但我相信可能会出现某种情况,即给定方法是否属于给定模型。 –

+0

更新的答案与一些有关该理论的看法。 虽然我认为我们可能会在这个讨论中超出堆栈溢出范围吗? –

+0

你会在哪里推荐这个讨论发生? –

相关问题