ruby on rails-试图在PG中仅显示今天的事件时出现ActiveRecord关系错误



我想做的是只显示今天发生的事件-

@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或将触发查询的某些可枚举方法(eachmap等)来构建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的答案。

相关内容

  • 没有找到相关文章