0

我有一个名为 Movies 的 rails 表。电影是从 API 收集和保存的,这意味着有些电影可能有 release_date 而有些可能没有。

所有电影都显示在主页上,并按{|t| - t.release_date.strftime("%Y%m%d").to_i}

<% @movies.sort_by{|t| - t.release_date.strftime("%Y%m%d").to_i}.each do |movie| %>

<% movie.title %>
<% movie.release_date.strftime("%Y") %>

<% end %>

因此,此代码可以正常工作,但前提是返回的电影有发布日期。如果他们没有分配发布日期,它会给我以下错误。

ActionView::Template::Error (undefined method `strftime' for nil:NilClass):

但是如果电影没有发布日期,我只会收到此错误。那么如何添加一个例外以仅显示带有 release_date 的电影,使用 strftime 将不再是问题。

我试过了

<% unless movie.release_date.blank? %>

<% @movies.sort_by{|t| - t.release_date.strftime("%Y%m%d").to_i}.each do |movie| %>

<% @movie.title %>
<% @movie.release_date.strftime("%Y") %>

<% end %>

<% end %>

但这不起作用,因为它给出了undefined method for 'movie'

4

2 回答 2

1

出于性能原因,您不应该使用 ruby​​ 对记录进行排序。这应该在数据库级别完成。

您应该首先确保 release_date 值以适当的格式保存,然后只需使用Movie.order("release_date desc"). 具有空值的记录将放置在结果的末尾。

于 2013-08-21T01:09:40.860 回答
1

您应该可以使用reject如下方式拒绝 nil release_date:

<% @movies.reject{ |m| m.release_date.nil? } %>

另一个问题是您在块中使用该变量movie作为实例变量。 @movieeach

尝试:

<% @movies.reject{ |m| m.release_date.nil? }.sort_by{|t| - t.release_date.strftime("%Y%m%d").to_i}.each do |movie| %>

<% movie.title %>
<% movie.release_date.strftime("%Y") %>

<% end %>

更新:

是的,正如@NicolasGarnil 在他的回答中指出的那样,在 SQL 方面比在 ruby​​ 方面做这些更好。只选择需要的记录,让数据库进行排序。因此,您可以将代码更新为:

在控制器中:

@movies = Movie.where('release_date is not null').order('release_date desc');

那么在你看来:

<% @movies.each do |movie| %>

<% movie.title %>
<% movie.release_date.strftime("%Y") %>

<% end %>
于 2013-08-21T01:14:12.383 回答