2013-04-08 40 views
0

我在rails中使用的db中有多對多的關係。在rails中處理多對多的關係

說我有一個模式,看起來像這樣:

電影院
- cinema_id
- 命名

電影
- movie_id
- 命名

放映時間
- showtime_id - 時間戳 - movie_id - cinema_id

所以basicaly:[電影院] 1 - N [放映時間] N - 1 [影]

在之一我的網頁我有一個電影編號,並希望根據cinema_id顯示電影並將每部電影的放映時間分組。我不確定如何正確處理這個問題。在.Net中,我將使用SelectMany linq運算符並創建一組電影,但這似乎不存在於ruby/rails中。要做到這一點,我認爲

一個辦法是做這樣的事情:

@showtimes = Showtime.where(:cinema_id, cinema_id) 
@showtimes.each do |st| 
    @movies.add(st.Movie) unless @movies.include? st.Movie 
end 

這將工作...但它似乎......醜,它僅僅是我嗎?

回答

1

您架構,每個showtime記錄都只有一個電影和一個電影院。你可以很容易地得到這樣的單獨列表:

@showtimes = Showtime.where(:cinema_id, cinema_id).order(:showing_at) 
@movies = @showtimes.map {|s| s.movie } 

你可能也想看看ActiveRecord中的.group和.includes方法。

如果您想直接進入電影呈現在某電影院的列表,你也可以這樣做:

@movies = Movie.joins(:showtimes).where('showtimes.cinema_id = ?', cinema_id) 

有了這一點,你可以遍歷所有的電影,並顯示每個人的放映時間。

+0

非常有趣。我今晚會檢查這個。 – Erick 2013-04-08 19:54:01

1

如果你在你的模型正確有您的關聯設置,你應該能夠做這樣的事情:

控制器:

@showtimes = Showtime.where(:cinema_id, cinema_id) 

查看:基於

<%= @showtimes.each do |showtime| %> 
    <p><%= showtime.movie.name %></p> 
<% end %> 
+0

確實如此,但無法在視圖中顯示每部電影的放映時間。你每次看電影都看電影,這並不是一個有趣的觀點。 – Erick 2013-04-08 19:08:19

+0

好點。查看group_by函數。它應該幫助你。 – Catfish 2013-04-08 19:46:02