私がやろうとしているのは、今日の出来事だけを示すことです-
@event = Events.where('EXTRACT(DAY FROM start) = ?', Date.today)
私が現れることができるのは だけです<ActiveRecord::Relation:0x007f8d06348d80>
。ページが読み込まれますが、それは私の表示テキストです。
私が間違っていることとどこで何かアイデアはありますか? ありがとう
私がやろうとしているのは、今日の出来事だけを示すことです-
@event = Events.where('EXTRACT(DAY FROM start) = ?', Date.today)
私が現れることができるのは だけです<ActiveRecord::Relation:0x007f8d06348d80>
。ページが読み込まれますが、それは私の表示テキストです。
私が間違っていることとどこで何かアイデアはありますか? ありがとう
まず、EXTRACT(DAY FROM start) = ?
タイムスタンプから「月の日」のように「日」を引き出しますが、日付全体ではありません。を使用するEXTRACT(DATE FROM start) = ?
か、単に日付にキャストしますstart::date = ?
。
これに加えて、単一のレコードを取得するのではなく、まだトリガーされていない遅延ロードされたコレクションを取得します。where
1 つのレコードがこのフィルターに一致すると予想される場合は、単に追加.first
して 1 つのイベントを返します。それ以外の場合は、クエリをトリガーして のコレクションを構築する.all
Enumerable メソッド ( each
、など) を使用します。map
Events
@event = Event.where("EXTRACT(DATE FROM start) = ?", Date.today).first
=> SELECT * FROM events WHERE EXTRACT(DATE FROM start) = '2013-01-04' LIMIT 1
@events = Event.where("EXTRACT(DATE FROM start) = ?", Date.today).all
=> SELECT * FROM events WHERE EXTRACT(DATE FROM start) = '2013-01-04'
この時点で、ActiveRecord オブジェクト (またはオブジェクトのコレクション) ができました。これは通常、直接レンダリングされるのではなく、属性またはメソッドを呼び出すことによってレンダリングされます。
したがって、: の代わりに、 :または類似のもの<%= @event %>
を使用します。<%= @event.description %>
ご覧のとおり、where
クラスメソッドはActiveRecord::Relation
オブジェクトを返すため、次のようにクエリを作成するためにさらに多くの呼び出しをチェーンし続けることができます。
Model.where(:a => a)
.where('b < ?', b)
.limit(6)
.order(:created_at)
ここで、anActiveRecord::Relation
は複数のアイテムを表します。一致するものは1つだけかもしれませんがActiveRecord::Relation
、データベースからすべてを取り出そうとするまで、それを知ることはできません。一致するものしかないことがわかっている場合は、次のように言うことができます。
@event = Event.where(...).first
しかし、おそらくあなたは言うべきです:
@events = Event.where(...)
そしてあなたの見解ではこのようなもの:
<% @events.each do |event| %>
<!-- Display event -->
<% end %>
これにより、「今日のイベントだけを表示する」ことができます(私の強調)。
また、 EXTRACTの使用方法については、 PinnyMの回答を参照してください。