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 = ?.

除此之外,您没有得到一条记录,而是一个尚未触发的延迟加载集合。如果您希望单个记录与此where过滤器匹配,则只需附加.first以返回单个事件。否则,使用或.all某些将触发查询以构建.eachmapEvents

@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代表多个项目,可能只有一个匹配项,但ActiveRecord::Relation在尝试将所有内容从数据库中拉出之前无法知道这一点。如果你知道只有匹配,那么你可以说:

@event = Event.where(...).first

但也许你应该说:

@events = Event.where(...)

然后在您看来是这样的:

<% @events.each do |event| %>
    <!-- Display event -->
<% end %>

这将允许您“仅显示今天的事件”(强调我的)。

并查看PinnyM对如何使用 EXTRACT 的回答。

于 2013-02-04T22:55:09.680 回答