我想做的是只显示今天发生的事件-
@event = Events.where('EXTRACT(DAY FROM start) = ?', Date.today)
我能出现的只有<ActiveRecord::Relation:0x007f8d06348d80>
。页面加载,但这是我显示的文本。
任何关于我做错了什么的想法&哪里感谢
首先,EXTRACT(DAY FROM start) = ?
从时间戳中提取"day of month"中的"day",而不是整个日期。使用EXTRACT(DATE FROM start) = ?
或使用start::date = ?
简单地转换为日期。
除此之外,您不会得到一条记录,而是一个尚未触发的懒惰加载集合。如果希望单个记录与此where
筛选器匹配,那么只需附加.first
即可返回单个Event。否则,请使用.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.description %>
或类似的东西来代替:<%= @event %>
。
正如您所看到的,where
类方法返回一个ActiveRecord::Relation
对象,这样您就可以继续链接更多的调用来构建这样的查询:
Model.where(:a => a)
.where('b < ?', b)
.limit(6)
.order(:created_at)
现在,ActiveRecord::Relation
代表多个项目,可能只有一个匹配,但ActiveRecord::Relation
在尝试从数据库中提取所有内容之前无法知道这一点。如果你知道只有匹配,那么你可以说:
@event = Event.where(...).first
但也许你应该说:
@events = Event.where(...)
然后在你看来是这样的:
<% @events.each do |event| %>
<!-- Display event -->
<% end %>
这将允许您"只显示今天发生的事件"(重点是我的)。
请参阅PinnyM关于如何使用EXTRACT的答案。