0

私は映画と呼ばれるレールテーブルを持っています。映画は 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 の使用が問題にならないように、release_date のある映画のみを表示する例外を追加するにはどうすればよいでしょうか。

私はもう試した

<% 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

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 の回答で指摘されているように、Ruby 側よりも SQL 側でこれらを実行することをお勧めします。必要なレコードのみを選択し、データベースに並べ替えさせます。したがって、コードを次のように更新できます。

コントローラーで:

@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 に答える
1

パフォーマンス上の理由から、レコードのソートに ruby​​ を使用しないでください。これは、データベース レベルで行う必要があります。

最初に release_date の値が適切な形式で永続化されていることを確認してから、Movie.order("release_date desc"). null 値を持つレコードは、結果の最後に配置されます。

于 2013-08-21T01:09:40.860 に答える