Ruby on Rails“渲染json:”忽略alias_attribute

时间:2016-03-23 15:54:32

标签: ruby-on-rails json render alias

我的 account.rb 模型文件中包含以下代码:

class Account < ActiveRecord::Base
  alias_attribute :id, :accountID
  alias_attribute :name, :awzAccountName
  alias_attribute :description, :awzAccountDescription
end

我的 accounts_controller.rb 文件中的索引方法中的以下代码:

def index
    @accounts = Account.all

    if params["page"]
      page = params["page"]
      items_per_page = params["per_page"]

      render :json => {:total => @accounts.count,:accounts => @accounts.page(page).per(items_per_page) }
    else
      render json: @accounts
    end
end

正如所料,render json: @accounts返回包含模型文件中定义的alias_attribute列名称的结果集。但是,render :json => {:total => @accounts.count,:accounts => @accounts.page(page).per(items_per_page) }代码返回包含原始列名称的结果集。有没有办法改变这个,以便使用alias_attribute列名?

2 个答案:

答案 0 :(得分:2)

我能够通过覆盖serializable_hash方法来解决此问题。

def serializable_hash(options = {})
  options[:methods] ||= []
  options[:methods] += [:name, :description]
  super(options)
end

您可以通过将methods参数传递给as_json而获得相同的结果,而无需更改模型的默认序列化。像这样:

render json: @accounts.as_json(methods: [:name, :description])

答案 1 :(得分:1)

我不希望render json: @accounts包含别名属性。 alias_attribute只是让您可以使用其他名称来引用该属性 - 它根本不会替换原始名称。

如果您想在模型的json输出中包含别名,可以覆盖as_json并明确添加这些方法:

def as_json(options = {})
  options[:methods] ||= []
  options[:methods] += [:name, :description]
  super(options)
end

(我故意省略:id,因为这可能是一个特殊情况 - 不完全确定,目前无法在本地测试)