我构建的应用程序的一部分是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。
有办法做到这一点吗?
谢谢!
答案 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