当外键是非传统的时,将相关模型对象添加到JSON编码

时间:2011-07-11 07:41:41

标签: ruby-on-rails ruby-on-rails-3

我正在尝试将模型对象数组编码为JSON,包括通过关联相关的数据。但我的架构中的外键字段不是modelname_id,所以我不能简单地做ActiveSupport :: JSON.encode(xxx,:include => {:modelname})。这种架构差异的原因是我认为应该是常见的。所以可能有一个既定的最佳实践,但我不知道。

相关迁移文件:

def self.up
  create_table :tables do |t|
    t.integer :room_id
    t.integer :table_num

    t.integer :user_1_id
    t.integer :user_2_id

    t.timestamps
  end
end

由于每个表可以让两个用户坐下来,我不能简单地使用user_id,但必须使用user_1_id和user_2_id

现在,假设我有一个我要编码为json的表数组,以及它我希望每个表对象都包含user_1_email:'xxx'和user_2_email:'xxx'字段。我怎么能这样做?

另外,当我在各种在线文档中搜索ActiveSupport :: JSON.encode时,我找不到任何关于我可以用选项做什么的文章。

例如,api in http://api.rubyonrails.org/ 只告诉我默认选项参数是nil,但没有说明我可以使用哪些选项。我错过了什么吗?

另外,我还可以在JSON编码中添加非模型属性吗? 我一直在寻找一种方法,但找不到任何东西。

1 个答案:

答案 0 :(得分:2)

您可以通过实现自定义#as_json方法轻松自定义和扩展对象的JSON表示。

示例:

class Table

  def as_json(options = nil) # This is just for interface compatibility
    {
      :id             => @id,
      :user_1_email   => @user1.email,
      :user_2_email   => @user2.email,
      :something_else => generate_something
    }
  end

end