返回选择查询中的虚拟属性

时间:2014-03-06 16:04:23

标签: ruby-on-rails postgresql activerecord ruby-on-rails-4

我构建的应用程序的一部分是API。最近的更改意味着我需要将两个不同版本的数据放入我的json feed中。我认为最好的方法是在数据库中进行必要的更改,然后创建一个虚拟属性来连接数据。

在我的模型中,我有event_summary虚拟属性,使用<%= @event.event_summary =>在视图中输出没有问题:

def event_summary
    "#{title} (#{start_datetime.strftime('%A %d %b, %l:%M%P')})"
end

在我的API控制器中,我有一个select查询,它获取API响应所需的属性(此处为简化版本):

respond_to :json

def index
  respond_with Event.select('title, event_summary')
end

问题是它总是返回一个未定义的列错误:

PG::UndefinedColumn: ERROR: column "event_summary" does not exist LINE 1: SELECT title, event_summary FROM "events"

我也尝试了以下但得到了相同的结果:

respond_with Event.select('title', :event_summary)

如果有任何不同,我会使用Postgres。

有办法做到这一点吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

您不能在select方法中使用虚拟属性,因为它将变为SQL语句,并且该字段在您的表中不存在。但是,您可以在SQL中执行连接和日期格式化:

Event.select('title, (title || ' ' || to_char(start_datetime, 'HH12:MI:SS')) as event_summary')

这实际上会创建一个“虚拟属性”,但是在sql land中它将返回具有该属性的事件,并由to_char postgres方法格式化。日期格式与您的格式不完全相同,因此您需要根据需要进行调整(通过更改格式字符串'HH12:MI:SS'),详见此处的文档:http://www.postgresql.org/docs/8.2/static/functions-formatting.html

希望有所帮助。

答案 1 :(得分:0)

我认为这可能会做你想要的:

def index
  render :json => Event.all.to_json :methods => :event_summary
end

[编辑]

IIRC respond_with不能与to_json一起使用,所以你必须使用render