2011-06-28 45 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

你會在哪裏推薦這個討論發生? –

相關問題