2013-04-08 59 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