Rails 3意外的JSON行为

时间:2011-09-07 18:29:25

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

模型

class Project
 has_many :tasks

class Task
 belongs_to :project

Task具有以下属性(等等)

t.string project
t.integer project_id

这是我继承的代码,我不确定为什么它有两个列,但我注意到这个设置有一个意外的行为。当我为@task呈现JSON时,它包含project信息(可能没有正确格式化JSON,但你明白了)

{
  "task": {
    "duration": 3,
    "project": {
      "project": {
        "id": 9,
        "description": "Roofing,
        "updated_at": "2011-09-07T16:58:34Z",
        ...
      }
    },
    "project_id": 9,
    ...
  }
}

我检查了数据库中的project列,结果为零。好像Rails将该列视为关系调用(我可以看到为什么是偶数)而不仅仅是一列,是否是预期的行为?

1 个答案:

答案 0 :(得分:0)

我认为你在假设命名冲突方面是正确的。您可以实际访问任务的项目(task.project),因此当rails JSON渲染器渲染task.project时,它会像您推测的那样拉下其关系的JSON再现。我建议您将该列的名称更改为不与rails的约定冲突,或者如果您不想更改数据库列,则可以更改关系的名称(请查看:class_name选项),但它可能会更改在路上造成更多混乱。我刚刚读到你继承了那段代码。通常,当您指定模型关系时,会自动获取访问任务项目的project_id和辅助方法project等属性。也许代码的作者没有意识到这一点,并认为有必要自己创建这两个列。保留project_id可能没问题,但project属性明显存在冲突。

或者,您可以通过在模型中使用签名def as_json(options={})定义一个方法来自行覆盖JSON再现,该签名返回表示所需JSON格式的散列,例如。 { :name => task.name, :project => something_else }