4

我必须为一个旧的手机应用程序生成一个 json 提要,并且一些标签需要与我的数据库列名不同。

我认为最有效的方法是在数据库级别创建一个别名。所以我正在做类似的事情

Site.where( mobile_visible: true ).select("non_clashing_id AS clientID")

产生 SQL

SELECT non_clashing_id AS clientID FROM `sites` WHERE `sites`.`mobile_visible` = 1 ORDER BY site_name

如果我在 MYSQL 工作台中运行此查询,它会生成一个带有ClientID我期望的标题的列,以及所需的值。

但是,如果我在 rails 视图中显示对象,我会得到{"clientID":null},{"clientID":null},{"clientID":null}

我究竟做错了什么?有没有更好的方法来做到这一点?

4

3 回答 3

3

这显示了如何访问变量

sites = Site.where( mobile_visible: true ).select("non_clashing_id AS clientID")
sites.each do |site|
  puts site.clientID
end
于 2012-06-01T13:27:55.140 回答
2

我认为默认情况下,activerecord从数据库加载列定义。而且,它应该只将值加载到现有列中。

Site.columns

我想您可以在该数组中再添加一项。或者您可以使用没有别名列名的普通查询,然后alias_attribute像 MurifoX 一样添加并覆盖as_json方法:

class Site < ActiveRecord::Base
  alias_attribute :client_id, :non_clashing_id

  def as_json(options={})
    options[:methods] = [:client_id]
    options[:only] = [:client_id]
    super
  end
end
于 2012-06-01T13:07:51.600 回答
1

除了数据库别名之外,请尝试将其放入您的模型中:

class model < ActiveRecord::Base
  alias_attribute :non_clashing_id, :client_id
  ...
end
于 2012-06-01T12:59:30.743 回答