处理rails中的多对多关系

时间:2013-04-08 18:44:28

标签: ruby-on-rails ruby activerecord ruby-on-rails-3.2

我在使用rails的数据库中有多对多的关系。

假设我有一个如下所示的架构:

  

电影院
    - cinema_id
    - 姓名

     


    - movie_id
    - 姓名

     

放映时间
    - showtime_id     - 时间戳     - movie_id     - cinema_id

所以基本上:[电影院] 1 - N [放映时间] N - 1 [电影]

在我的一个页面中,我有一个电影院ID,想要根据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

那会起作用......但似乎......丑陋或只是我?

2 个答案:

答案 0 :(得分:1)

如果您在模型中正确设置了关联,则应该可以执行以下操作:

控制器:

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

查看:

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

答案 1 :(得分: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)

有了它,你可以循环播放电影并显示每个人的放映时间。