我想做的只是展示今天发生的事件-
@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
过滤器匹配,则只需附加.first
以返回单个事件。否则,使用或.all
某些将触发查询以构建.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
代表多个项目,可能只有一个匹配项,但ActiveRecord::Relation
在尝试将所有内容从数据库中拉出之前无法知道这一点。如果你知道只有匹配,那么你可以说:
@event = Event.where(...).first
但也许你应该说:
@events = Event.where(...)
然后在您看来是这样的:
<% @events.each do |event| %>
<!-- Display event -->
<% end %>
这将允许您“仅显示今天的事件”(强调我的)。
并查看PinnyM对如何使用 EXTRACT 的回答。