【问题标题】:Rails 3 unexpected JSON behaviorRails 3 意外的 JSON 行为
【发布时间】:2011-09-07 18:29:24
【问题描述】:

型号

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 将该列视为关系调用(我什至可以理解为什么)而不仅仅是一列,这是预期的行为吗?

【问题讨论】:

  • 什么是project 列(类型字符串)?我看到你有外键 project_id,但看起来是正确的。
  • 是的,如上所述,project 列的类型为 string
  • 对不起,不清楚,我的意思是“项目列是什么?”,其中存储了哪些数据?我说的是(类型字符串)将它与整数类型的project_id 区分开来。显然project 是一个字符串。

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


【解决方案1】:

我认为您对命名冲突的假设是正确的。您实际上可以像这样访问您的任务项目 (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 }.

【讨论】:

  • 是的,我对名称冲突的看法是正确的,我咨询了原始开发人员(他是 Rails 的新手)并确保 project 列没有真正用途,我删除了它,现在没有了更长的时间拉取相关的project 信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
  • 2017-04-20
  • 2021-11-24
  • 1970-01-01
  • 2016-05-29
相关资源
最近更新 更多