0

私がやろうとしているのは、今日の出来事だけを示すことです-

@event = Events.where('EXTRACT(DAY FROM start) = ?', Date.today)

私が現れることができるのは だけです<ActiveRecord::Relation:0x007f8d06348d80>。ページが読み込まれますが、それは私の表示テキストです。

私が間違っていることとどこで何かアイデアはありますか? ありがとう

4

2 に答える 2

2

まず、EXTRACT(DAY FROM start) = ?タイムスタンプから「月の日」のように「日」を引き出しますが、日付全体ではありません。を使用するEXTRACT(DATE FROM start) = ?か、単に日付にキャストしますstart::date = ?

これに加えて、単一のレコードを取得するのではなく、まだトリガーされていない遅延ロードされたコレクションを取得します。where1 つのレコードがこのフィルターに一致すると予想される場合は、単に追加.firstして 1 つのイベントを返します。それ以外の場合は、クエリをトリガーして のコレクションを構築する.allEnumerable メソッド ( each、など) を使用します。mapEvents

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

于 2013-02-04T21:57:32.137 に答える
1

ご覧のとおり、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の回答を参照してください。

于 2013-02-04T22:55:09.680 に答える