0

我在与 rails 一起使用的数据库中存在多对多关系。

假设我有一个看起来像这样的模式:

电影院
-cinema_id
- 名称

电影
- movie_id
- 名称

放映时间
- 放映时间 ID - 时间戳 - 电影 ID - 电影 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

那行得通……但看起来……丑陋还是只有我?

4

2 回答 2

1

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

控制器:

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

看法:

<%= @showtimes.each do |showtime| %>
    <p><%= showtime.movie.name %></p>  
<% end %>
于 2013-04-08T18:48:22.640 回答
1

根据您的架构,每个放映时间记录将恰好包含一部电影和一部电影。您可以通过这种方式轻松获得单独的列表:

@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)

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

于 2013-04-08T19:41:27.263 回答